 跟我学Shiro - 张开涛tion:*”或者 “organization:*:*”。可以这么理解,这种方式实现了前缀匹配。 另外如“user:*”可以匹配如“user:delete”、“user:delete”可以匹配如“user:delete:1”、 “user:*:1”可以匹配如“user:view:1”、“user”可以匹配“user:view”或“user:view:1” 等 。 即 *可 以 匹 配 所 有 , 匹 配 “system:user:view”,需要使用“*:*:view”,即后缀匹配必须指定前缀(多个冒号就需要 多个*来匹配)。 7、WildcardPermission 如下两种方式是等价的: 因此没什么必要的话使用字符串更方便。 8、性能问题 通配符匹配方式比字符串相等匹配来说是更复杂的,因此需要花费更长时间,但是一般系 统的权限不会太多,且可以配合缓存 统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以 实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不 建议使用,可能造成查询权限及匹配变慢。可以考虑比如在 sql 查询时加上权限字符串之 类的方式在查询时就完成了权限匹配。 role75=user:*:* subject().checkPermissions("user:view:1", "user:auth:2");0 码力 | 219 页 | 4.16 MB | 10 月前3 跟我学Shiro - 张开涛tion:*”或者 “organization:*:*”。可以这么理解,这种方式实现了前缀匹配。 另外如“user:*”可以匹配如“user:delete”、“user:delete”可以匹配如“user:delete:1”、 “user:*:1”可以匹配如“user:view:1”、“user”可以匹配“user:view”或“user:view:1” 等 。 即 *可 以 匹 配 所 有 , 匹 配 “system:user:view”,需要使用“*:*:view”,即后缀匹配必须指定前缀(多个冒号就需要 多个*来匹配)。 7、WildcardPermission 如下两种方式是等价的: 因此没什么必要的话使用字符串更方便。 8、性能问题 通配符匹配方式比字符串相等匹配来说是更复杂的,因此需要花费更长时间,但是一般系 统的权限不会太多,且可以配合缓存 统的权限不会太多,且可以配合缓存来提供其性能,如果这样性能还达不到要求我们可以 实现位操作算法实现性能更好的权限匹配。另外实例级别的权限验证如果数据量太大也不 建议使用,可能造成查询权限及匹配变慢。可以考虑比如在 sql 查询时加上权限字符串之 类的方式在查询时就完成了权限匹配。 role75=user:*:* subject().checkPermissions("user:view:1", "user:auth:2");0 码力 | 219 页 | 4.16 MB | 10 月前3
 Apache Shiro参考手册中文版是为了满足用户的要求和需要。即使该“用户”是另一个软件系统 而不是一个人类,你仍然得编写代码来响应行为,基于当前与你的软件进行交互的人或物。 Shiro 在它自己的设计中体现了这些概念。通过匹配那些对于软件开发人员来说已经很直观的东西,Apache Shiro 几 乎在任何应用程序保持了直观和易用性。 High-Level Overview 在最高的概念层次,Shiro 的架构有 对于一个用户证明自己 的身份来说,他们需要提供一些身份识别信息,以及某些你的系统能够理解和信任的身份证明。 这是通过提交用户的身份和凭证给 Shiro,以判断它们是否和应用程序预期的相匹配。  Principals(身份)是 Subject 的‘identifying attributes(标识属性)’。Principals(身份)可以是任何能够证明 Subject 的 ,生物特征数据如指纹和视网膜扫描, 以及 X.509 证书。 principal/credential 配对最常见的例子是用户名和密码。用户名是所声称的身份,密码是匹配所声称的身份的 证明。如果提交的密码与应用程序期望的相匹配,应用程序可以很大程度上假设用户真的是他们说的他们是 谁,因为其他人都应该不知道同样的密码。 Authenticating Subjects(验证 Subjects)0 码力 | 92 页 | 1.16 MB | 1 年前3 Apache Shiro参考手册中文版是为了满足用户的要求和需要。即使该“用户”是另一个软件系统 而不是一个人类,你仍然得编写代码来响应行为,基于当前与你的软件进行交互的人或物。 Shiro 在它自己的设计中体现了这些概念。通过匹配那些对于软件开发人员来说已经很直观的东西,Apache Shiro 几 乎在任何应用程序保持了直观和易用性。 High-Level Overview 在最高的概念层次,Shiro 的架构有 对于一个用户证明自己 的身份来说,他们需要提供一些身份识别信息,以及某些你的系统能够理解和信任的身份证明。 这是通过提交用户的身份和凭证给 Shiro,以判断它们是否和应用程序预期的相匹配。  Principals(身份)是 Subject 的‘identifying attributes(标识属性)’。Principals(身份)可以是任何能够证明 Subject 的 ,生物特征数据如指纹和视网膜扫描, 以及 X.509 证书。 principal/credential 配对最常见的例子是用户名和密码。用户名是所声称的身份,密码是匹配所声称的身份的 证明。如果提交的密码与应用程序期望的相匹配,应用程序可以很大程度上假设用户真的是他们说的他们是 谁,因为其他人都应该不知道同样的密码。 Authenticating Subjects(验证 Subjects)0 码力 | 92 页 | 1.16 MB | 1 年前3
 Apache Shiro 1.2.x Reference Manual 中文翻译uae ) { //username 不存在,给个错误提示? } catch ( IncorrectCredentialsException ice ) { //password 不匹配,再输入? } catch ( LockedAccountException lae ) { //账号锁住了,不能登入。给个提示? } ... 更多类型异常 ... } catch 是证明一个用户的真实身份。为了证明用户身份,需要提供系统理解和相信的身份信息和证 据。 需要通过向 Shiro 提供用户的身份(principals)和证明(credentials )来判定是否和系统所 要求的匹配。 Principals(身份) 是Subject的“标识属性”,可以是任何与Subject相关的标识,比如说名 称(给定名称)、名字(姓或者昵称)、用户名、安全号码等等,当然像昵称这样的内 printer:query, print:lp7200 * 通配符, , 子部件分离器可用于权限的任何部分。 Missing Parts 缺省的部分 最后要注意的是权限分配:缺省的部分意味着用户可以访问所有与之匹配的值,换句话说 printer:print 等价于 printer:print:* 并且 Apache Shiro 1.2.x Reference Manual 中文翻译 63 6.1.0 码力 | 196 页 | 2.34 MB | 1 年前3 Apache Shiro 1.2.x Reference Manual 中文翻译uae ) { //username 不存在,给个错误提示? } catch ( IncorrectCredentialsException ice ) { //password 不匹配,再输入? } catch ( LockedAccountException lae ) { //账号锁住了,不能登入。给个提示? } ... 更多类型异常 ... } catch 是证明一个用户的真实身份。为了证明用户身份,需要提供系统理解和相信的身份信息和证 据。 需要通过向 Shiro 提供用户的身份(principals)和证明(credentials )来判定是否和系统所 要求的匹配。 Principals(身份) 是Subject的“标识属性”,可以是任何与Subject相关的标识,比如说名 称(给定名称)、名字(姓或者昵称)、用户名、安全号码等等,当然像昵称这样的内 printer:query, print:lp7200 * 通配符, , 子部件分离器可用于权限的任何部分。 Missing Parts 缺省的部分 最后要注意的是权限分配:缺省的部分意味着用户可以访问所有与之匹配的值,换句话说 printer:print 等价于 printer:print:* 并且 Apache Shiro 1.2.x Reference Manual 中文翻译 63 6.1.0 码力 | 196 页 | 2.34 MB | 1 年前3
 Java 应用与开发 - 异常处理语句块中出现 return 语句时,finally 语句块同样会执行。 大纲 异常的概念及分类 Java 异常处理机制 操作异常对象 发生异常时,系统将自动创建异常类对象,并将作为实参传递给 匹配的 catch 语句块的形参,这样就可以在语句块中操纵该异常 对象。 O 异常类的父类 Throwable 中定义的方法 getMessage() 返回描述当前异常的详细消息字符串。 printStackTrace() 常用,在没有找到适合的异常处理代码时,系统也 会自动调用该方法输出错误信息。 大纲 异常的概念及分类 Java 异常处理机制 操作异常对象 发生异常时,系统将自动创建异常类对象,并将作为实参传递给 匹配的 catch 语句块的形参,这样就可以在语句块中操纵该异常 对象。 O 异常类的父类 Throwable 中定义的方法 getMessage() 返回描述当前异常的详细消息字符串。 printStackTrace()0 码力 | 33 页 | 626.40 KB | 1 年前3 Java 应用与开发 - 异常处理语句块中出现 return 语句时,finally 语句块同样会执行。 大纲 异常的概念及分类 Java 异常处理机制 操作异常对象 发生异常时,系统将自动创建异常类对象,并将作为实参传递给 匹配的 catch 语句块的形参,这样就可以在语句块中操纵该异常 对象。 O 异常类的父类 Throwable 中定义的方法 getMessage() 返回描述当前异常的详细消息字符串。 printStackTrace() 常用,在没有找到适合的异常处理代码时,系统也 会自动调用该方法输出错误信息。 大纲 异常的概念及分类 Java 异常处理机制 操作异常对象 发生异常时,系统将自动创建异常类对象,并将作为实参传递给 匹配的 catch 语句块的形参,这样就可以在语句块中操纵该异常 对象。 O 异常类的父类 Throwable 中定义的方法 getMessage() 返回描述当前异常的详细消息字符串。 printStackTrace()0 码力 | 33 页 | 626.40 KB | 1 年前3
 《Java 应用与开发》课程讲义 - 王晓东<方法名>(<实参列表>) 子类构造方法中调用父类的构造方法 1 super(<实参列表>) super 的追溯不仅限于直接父类,而是先从直接父类开始查找,如果找不到则逐层 上溯,一旦在某个层次父类中找到匹配成员即停止追溯并使用该成员。 示例代码:super 用法示例 A 1 class Animal { 2 protected int i = 1; //用于测试同名属性,无现实含义 3 } 5 46 5.1. 多态性 � 5 � 教学内容 5.1 多态性 5.1.1 多态的概念 在 Java 中,子类的对象可以替代父类的对象使用称为多态。Java 引用变量与所引 用对象间的类型匹配关系如下: • 一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。 • 一个引用类型变量可能引用(指向)多种不同类型的对象——既可以引用其声明 类型的对象,也可以引用其声明类型的子类的对象。 17 } 10.7.2 Collections 类 java.util.Collections 类定义了多种集合操作方法,能够实现了对集合元素的排序、 取极值、批量拷贝、集合结构转换、循环移位以及匹配性检查等功能。Collections 类的 主要方法包括: • public static void sort(List list) • public static void reverse(List0 码力 | 330 页 | 6.54 MB | 1 年前3 《Java 应用与开发》课程讲义 - 王晓东<方法名>(<实参列表>) 子类构造方法中调用父类的构造方法 1 super(<实参列表>) super 的追溯不仅限于直接父类,而是先从直接父类开始查找,如果找不到则逐层 上溯,一旦在某个层次父类中找到匹配成员即停止追溯并使用该成员。 示例代码:super 用法示例 A 1 class Animal { 2 protected int i = 1; //用于测试同名属性,无现实含义 3 } 5 46 5.1. 多态性 � 5 � 教学内容 5.1 多态性 5.1.1 多态的概念 在 Java 中,子类的对象可以替代父类的对象使用称为多态。Java 引用变量与所引 用对象间的类型匹配关系如下: • 一个对象只能属于一种确定的数据类型,该类型自对象创建直至销毁不能改变。 • 一个引用类型变量可能引用(指向)多种不同类型的对象——既可以引用其声明 类型的对象,也可以引用其声明类型的子类的对象。 17 } 10.7.2 Collections 类 java.util.Collections 类定义了多种集合操作方法,能够实现了对集合元素的排序、 取极值、批量拷贝、集合结构转换、循环移位以及匹配性检查等功能。Collections 类的 主要方法包括: • public static void sort(List list) • public static void reverse(List0 码力 | 330 页 | 6.54 MB | 1 年前3
 Java 应用与开发 - Servlet 编程Servlet 概述 Servlet 编程 Servlet 生命周期 Servlet 配置 Servlet 部署 Servlet 示例 Servlet 配置 O Servlet 映射 映射地址方式  匹配目录模式映射方式 1 Java 应用与开发 - Servlet 编程Servlet 概述 Servlet 编程 Servlet 生命周期 Servlet 配置 Servlet 部署 Servlet 示例 Servlet 配置 O Servlet 映射 映射地址方式  匹配目录模式映射方式 1- 2 - MainAction 3- /main/* Servlet 概述 Servlet 编程 Servlet 生命周期 Servlet 配置 Servlet 部署 Servlet 示例 Servlet 配置 O Servlet 映射 映射地址方式  匹配扩展名模式映射方式 1- 2 - MainAction 3- *.action 0 码力 | 50 页 | 725.36 KB | 1 年前3
 Java 应用与开发 - 面向对象编程进阶final 大纲 多态性 方法重载 关键字 static 关键字 final 什么是多态? 在 Java 中,子类的对象可以替代父类的对象使用称为多态。 O Java 引用变量与所引用对象间的类型匹配关系 ▶ 一个对象只能属于一种确定的数据类型,该类型自对象创建 直至销毁不能改变。 ▶ 一个引用类型变量可能引用(指向)多种不同类型的对象 ——既可以引用其声明类型的对象,也可以引用其声明类型 Person类型变量p 大纲 多态性 方法重载 关键字 static 关键字 final 什么是多态? 在 Java 中,子类的对象可以替代父类的对象使用称为多态。 O Java 引用变量与所引用对象间的类型匹配关系 ▶ 一个对象只能属于一种确定的数据类型,该类型自对象创建 直至销毁不能改变。 ▶ 一个引用类型变量可能引用(指向)多种不同类型的对象 ——既可以引用其声明类型的对象,也可以引用其声明类型0 码力 | 49 页 | 659.74 KB | 1 年前3 Java 应用与开发 - 面向对象编程进阶final 大纲 多态性 方法重载 关键字 static 关键字 final 什么是多态? 在 Java 中,子类的对象可以替代父类的对象使用称为多态。 O Java 引用变量与所引用对象间的类型匹配关系 ▶ 一个对象只能属于一种确定的数据类型,该类型自对象创建 直至销毁不能改变。 ▶ 一个引用类型变量可能引用(指向)多种不同类型的对象 ——既可以引用其声明类型的对象,也可以引用其声明类型 Person类型变量p 大纲 多态性 方法重载 关键字 static 关键字 final 什么是多态? 在 Java 中,子类的对象可以替代父类的对象使用称为多态。 O Java 引用变量与所引用对象间的类型匹配关系 ▶ 一个对象只能属于一种确定的数据类型,该类型自对象创建 直至销毁不能改变。 ▶ 一个引用类型变量可能引用(指向)多种不同类型的对象 ——既可以引用其声明类型的对象,也可以引用其声明类型0 码力 | 49 页 | 659.74 KB | 1 年前3
 Nacos架构&原理
Nacos 最佳实践 < 196 我们只需要把 Eureka SDK 换到 Nacos SDK 即可,实现如下功能:  Solar 蓝绿灰度发布 ○ 版本匹配灰度发布 ○ 版本权重灰度发布  Solar 多区域路由 ○ 区域匹配灰度路由 ○ 区域权重灰度路由  Solar 子环境隔离 ○ 环境隔离 ○ 环境路由  Solar 版本号和区域值,子环境号策略 ○ DEV 环境,Git default 0; } location /some_url_to_write { if ($limit_write = 1) { return 403; } }  map 指令匹配 remote_addr 变量,如果 $remote_addr 变量在 ip 黑名单里面,则设置 limi t_read 和 limit_write 参数为 1,否则为 0  在写接口中对 limit_write abfe3dc 1; default 0; } location /some_url { if ($limit_namespace = 1) { return 403; } } 通过匹配 namespace 是否在黑名单中来设置 limit_namespace 变量,然后在访问的 url 中判断 limit_namespace 的值,如果为 1 返回 403 状态码。 ak 维度:使用⼀个0 码力 | 326 页 | 12.83 MB | 9 月前3 Nacos架构&原理
Nacos 最佳实践 < 196 我们只需要把 Eureka SDK 换到 Nacos SDK 即可,实现如下功能:  Solar 蓝绿灰度发布 ○ 版本匹配灰度发布 ○ 版本权重灰度发布  Solar 多区域路由 ○ 区域匹配灰度路由 ○ 区域权重灰度路由  Solar 子环境隔离 ○ 环境隔离 ○ 环境路由  Solar 版本号和区域值,子环境号策略 ○ DEV 环境,Git default 0; } location /some_url_to_write { if ($limit_write = 1) { return 403; } }  map 指令匹配 remote_addr 变量,如果 $remote_addr 变量在 ip 黑名单里面,则设置 limi t_read 和 limit_write 参数为 1,否则为 0  在写接口中对 limit_write abfe3dc 1; default 0; } location /some_url { if ($limit_namespace = 1) { return 403; } } 通过匹配 namespace 是否在黑名单中来设置 limit_namespace 变量,然后在访问的 url 中判断 limit_namespace 的值,如果为 1 返回 403 状态码。 ak 维度:使用⼀个0 码力 | 326 页 | 12.83 MB | 9 月前3
 Hello 算法 1.1.0 Java版} // 直接遍历数组元素 for (int num : nums) { count += num; } } 6. 查找元素 在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。 因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。 // === File: array.java === /* 在数组中查找指定元素 */ int find(int[] 行比较。如果两者匹 配,那么密码就被视为正确。 ‧ 数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 单向性:无法通过哈希值反推出关于输入数据的任何信息。 第 被新元素使用。这样做既能保持哈希表的探测序列不变,又能保证哈希表的空间使用率。 Q:为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因此,线性探测 法会根据预先设定的步长依次向下查找,直至找到正确的键值对或无法找到跳出为止。 第 6 章 哈希表 hello‑algo.com 134 Q:为什么哈希表扩容能够缓解哈希冲突?0 码力 | 378 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 Java版} // 直接遍历数组元素 for (int num : nums) { count += num; } } 6. 查找元素 在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。 因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。 // === File: array.java === /* 在数组中查找指定元素 */ int find(int[] 行比较。如果两者匹 配,那么密码就被视为正确。 ‧ 数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 单向性:无法通过哈希值反推出关于输入数据的任何信息。 第 被新元素使用。这样做既能保持哈希表的探测序列不变,又能保证哈希表的空间使用率。 Q:为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因此,线性探测 法会根据预先设定的步长依次向下查找,直至找到正确的键值对或无法找到跳出为止。 第 6 章 哈希表 hello‑algo.com 134 Q:为什么哈希表扩容能够缓解哈希冲突?0 码力 | 378 页 | 18.47 MB | 1 年前3
 Hello 算法 1.0.0b5 Java版count++; } // 直接遍历数组 for (int num : nums) { count++; } } 6. 查找元素 在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。 因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。 // === File: array.java === /* 在数组中查找指定元素 */ int find(int[] 行比较。如果两者匹 配,那么密码就被视为正确。 ‧ 数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 用。这样做既能保持哈希表的探测 序列不变,又能保证哈希表的空间使用率。 � 为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因 此,线性探测法会根据预先设定的步长依次向下查找,直至找到正确的键值对或无法找到跳 出为止。 � 为什么哈希表扩容能够缓解哈希冲突? 哈希函数的最后一步往往是对数组长度0 码力 | 376 页 | 30.69 MB | 1 年前3 Hello 算法 1.0.0b5 Java版count++; } // 直接遍历数组 for (int num : nums) { count++; } } 6. 查找元素 在数组中查找指定元素需要遍历数组,每轮判断元素值是否匹配,若匹配则输出对应索引。 因为数组是线性数据结构,所以上述查找操作被称为“线性查找”。 // === File: array.java === /* 在数组中查找指定元素 */ int find(int[] 行比较。如果两者匹 配,那么密码就被视为正确。 ‧ 数据完整性检查:数据发送方可以计算数据的哈希值并将其一同发送;接收方可以重新计算接收到的 数据的哈希值,并与接收到的哈希值进行比较。如果两者匹配,那么数据就被视为完整的。 对于密码学的相关应用,为了防止从哈希值推导出原始密码等逆向工程,哈希算法需要具备更高等级的安全 特性。 ‧ 抗碰撞性:应当极其困难找到两个不同的输入,使得它们的哈希值相同。 用。这样做既能保持哈希表的探测 序列不变,又能保证哈希表的空间使用率。 � 为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因 此,线性探测法会根据预先设定的步长依次向下查找,直至找到正确的键值对或无法找到跳 出为止。 � 为什么哈希表扩容能够缓解哈希冲突? 哈希函数的最后一步往往是对数组长度0 码力 | 376 页 | 30.69 MB | 1 年前3
共 15 条
- 1
- 2













