Apache Shiro 1.2.x Reference Manual 中文翻译Granularity 权限粒度 上面的权限示例都是针对资源(门、文件、客户等)指定的动作(打开、读、删除等),在 一些场景中,他们也会指定非常细粒度的“实例级别”行为--例如,“删除”(delete)名 为“Jsmith”(实例标识)的“用户”(资源类型),在 Shiro 中,你可以精确定义指令到你所能 细化到的程度。 我们在 Shiro 的 Permissions 文档中详细讨论权限粒度和权限指令的“级别”。 src/main/webapp/home.jsp :应用的简单的默认主页。 包括 include.jsp (如将其他人,因为 我们很快就会看到)。 src/main/webapp/index.jsp :默认站点索引页面-这仅仅是将请求转发给我们 home.jsp 主 页。 4. Run the webapp 运行 运行 $ mvn jetty:run 打开浏览器访问 localhost:8080,页面将会输出 :jsmith”) ) { //删除‘jsmith’用户 } else { //不删除‘jsmith’ } 该例表明,你可以对你需要的单个资源进行访问控制,甚至深入到非常细粒度的实例级别。 如果愿意,你甚至还可以发明自己的权限语法。参见 Shiro Permission 文档可以了解更多内 容。最后,就像使用认证那样,上述调用最终会转向 SecurityManager,它会咨询Realm做出0 码力 | 196 页 | 2.34 MB | 1 年前3
Nacos架构&原理
⼀组相关或者不相关的配置项的集合称为配置集。在系统中,⼀个配置文件通常就是⼀个配置集, 包含了系统各个方面的配置。例如,⼀个配置集可能包含了数据源、线程池、日志级别等配置项。 命名空间(Namespace) 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。 Namespace 的常用场景之⼀是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源 (如数据库 在服务发现领域中,服务指的是由应用程序提供的⼀个或⼀组软件功能的⼀种抽象概念(例如上述 例子的登陆或支付)。它和应用有所不同,应用的范围更广,和服务属于包含关系,即⼀个应用可 能会提供多个服务。为了能够更细粒度地区分和控制服务,Nacos 选择服务作为注册中心的最基本 概念。 而服务实例(以下简称实例)是某个服务的具体提供能力的节点,⼀个实例仅从属于⼀个服务,而 ⼀个服务可以包含⼀个或多个实例。在许 namespace+group+dataId 组成某⼀个授权资源,是最细能做到的水准,但是这么细的授权粒度, 会导致权限数据暴涨,有多少配置(100w),就会有多少授权数据,这样在分布式权限系统中是不 能搞定的,因为要有 100w 授权数据,意味着我每个 nacos 节点要监听 100w 个权限数据。因此权 限管控粒度在实际生产环境,只能控制到 group 级别。namespace+group。或者 namespace0 码力 | 326 页 | 12.83 MB | 10 月前3
跟我学Shiro - 张开涛Authentication:身份认证/登录,验证用户是不是拥有相应的身份; Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用 户对某个资源是否具有某个权限; Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信 息都在会话中;会话可以是普通 JavaSE 环境的,也可以是如 允不允许,不反映谁去执行这个操作。所以后续还需要把权限赋予给用户,即定义哪个用 户允许在某个资源上做什么操作(权限),Shiro 不会去做这件事情,而是由实现人员提供。 Shiro 支持粗粒度权限(如用户模块的所有权限)和细粒度权限(操作某个用户的权限,即 实例级别的),后续部分介绍。 角色 角色代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权 限,即这样用户可以拥有一组权 技术总监查看用户、查看权限了,需要在相关代码中把技术总监角色从判断逻辑中删除掉; 即粒度是以角色为单位进行访问控制的,粒度较粗;如果进行修改可能造成多处代码修改。 显示角色:在程序中通过权限控制谁能访问某个资源,角色聚合一组权限集合;这样假设 哪个角色不能访问某个资源,只需要从角色代表的权限集合中移除即可;无须修改多处代 码;即粒度是以资源/实例为单位的;粒度较细。 跟我学 Shiro——http://jinnianshilongnian0 码力 | 219 页 | 4.16 MB | 10 月前3
Apache Shiro参考手册中文版权限粒度 以上所有权限例子详细说明了在某一资源类型(入口,文件,客户等等)的行为(打开,阅读,删除等等)。在某 些情况下,它们甚至可以指定非常细粒度的实例级的行为——例如,“删除”(行为)用户名为"jsmith"的“用户” (资源类型)。在 Shiro,你有能力来定义这些声明能够达到的精确粒度。 我们将在 Shiro 的 Permission 文档中更加详细地讨论权限粒度和许可声明的“等级”。0 码力 | 92 页 | 1.16 MB | 1 年前3
Hello 算法 1.0.0b4 Java版某些算法的时间复杂度不是固定的,而是与输入数据的分布有关。例如,假设输入一个长度为 ? 的数组 nums ,其中 nums 由从 1 至 ? 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 1 的索引。我们可 以得出以下结论: ‧ 当 nums = [?, ?, ..., 1] ,即当末尾元素是 1 时,需要完整遍历数组,此时达到 最差时间复杂度 ?(?) 。 ‧ 当 nums = [1, int[n]; for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 度」可以体现算法在随机输入数据下 的运行效率,用 Θ 记号来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数则是数组长度的一半 ? 2 ,平均 时间复杂度为 Θ(? 2) = Θ(?) 。 但在实际应用中,尤其是较为复杂的算法,计算平均时间复杂度比较困难,因为很难简便地分析出在数据分0 码力 | 342 页 | 27.39 MB | 1 年前3
Hello 算法 1.1.0 Java版算法的时间效率往往不是固定的,而是与输入数据的分布有关。假设输入一个长度为 ? 的数组 nums ,其中 nums 由从 1 至 ? 的数字组成,每个数字只出现一次;但元素顺序是随机打乱的,任务目标是返回元素 1 的 索引。我们可以得出以下结论。 ‧ 当 nums = [?, ?, ..., 1] ,即当末尾元素是 1 时,需要完整遍历数组,达到最差时间复杂度 ?(?) 。 ‧ 当 nums = [1, ?, ? hello‑algo.com 41 for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 杂度可以体现算法在随机输入数据下的 运行效率,用 Θ 记号来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数就是数组长度的一半 ?/2 ,平 均时间复杂度为 Θ(?/2) = Θ(?) 。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。0 码力 | 378 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0b2 Java版某些算法的时间复杂度不是恒定的,而是与输入数据的分布有关。举一个例子,输入一个长度为 ? 数组 nums , 其中 nums 由从 1 至 ? 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 1 的索引。我们可以得 出以下结论: ‧ 当 nums = [?, ?, ..., 1],即当末尾元素是 1 时,则需完整遍历数组,此时达到 最差时间复杂度 ?(?) ; ‧ 当 nums = [1, int[n]; for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 的 运行效率,用 Θ 记号(Theta Notation)来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数则是数组长度的一半 ? 2 ,平均 时间复杂度为 Θ(? 2) = Θ(?) 。 但在实际应用中,尤其是较为复杂的算法,计算平均时间复杂度比较困难,因为很难简便地分析出在数据分布0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0 Java版算法的时间效率往往不是固定的,而是与输入数据的分布有关。假设输入一个长度为 ? 的数组 nums ,其中 nums 由从 1 至 ? 的数字组成,每个数字只出现一次;但元素顺序是随机打乱的,任务目标是返回元素 1 的 索引。我们可以得出以下结论。 ‧ 当 nums = [?, ?, ..., 1] ,即当末尾元素是 1 时,需要完整遍历数组,达到最差时间复杂度 ?(?) 。 ‧ 当 nums = [1, ?, ? hello‑algo.com 41 for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 复杂度可以体现算法在随机输入数据下的 运行效率,用 Θ 记号来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数就是数组长度的一半 ?/2 ,平 均时间复杂度为 Θ(?/2) = Θ(?) 。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。0 码力 | 376 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b5 Java版算法的时间效率往往不是固定的,而是与输入数据的分布有关。假设输入一个长度为 ? 的数组 nums ,其中 nums 由从 1 至 ? 的数字组成,每个数字只出现一次;但元素顺序是随机打乱的,任务目标是返回元素 1 的 索引。我们可以得出以下结论。 ‧ 当 nums = [?, ?, ..., 1] ,即当末尾元素是 1 时,需要完整遍历数组,达到最差时间复杂度 ?(?) 。 ‧ 当 nums = [1, ?, ? int[n]; for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 复杂度分析 hello‑algo.com 39 用 Θ 记号来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数就是数组长度的一半 ?/2 ,平 均时间复杂度为 Θ(?/2) = Θ(?) 。 但对于较为复杂的算法,计算平均时间复杂度往往是比较困难的,因为很难分析出在数据分布下的整体数学0 码力 | 376 页 | 30.69 MB | 1 年前3
Hello 算法 1.0.0b1 Java版某些算法的时间复杂度不是恒定的,而是与输入数据的分布有关。举一个例子,输入一个长度为 ? 数组 nums , 其中 nums 由从 1 至 ? 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 1 的索引。我们可以得 出以下结论: ‧ 当 nums = [?, ?, ..., 1],即当末尾元素是 1 时,则需完整遍历数组,此时达到 最差时间复杂度 ?(?) ; ‧ 当 nums = [1, int[n]; for (int i = 0; i < n; i++) { res[i] = nums[i]; } return res; } /* 查找数组 nums 中数字 1 所在索引 */ int findOne(int[] nums) { for (int i = 0; i < nums.length; i++) { // 当元素 1 在数组头部时,达到最佳时间复杂度 O(1) 的 运行效率,用 Θ 记号(Theta Notation)来表示。 对于部分算法,我们可以简单地推算出随机数据分布下的平均情况。比如上述示例,由于输入数组是被打乱 的,因此元素 1 出现在任意索引的概率都是相等的,那么算法的平均循环次数则是数组长度的一半 ? 2 ,平均 时间复杂度为 Θ(? 2) = Θ(?) 。 但在实际应用中,尤其是较为复杂的算法,计算平均时间复杂度比较困难,因为很难简便地分析出在数据分布0 码力 | 186 页 | 14.71 MB | 1 年前3
共 17 条
- 1
- 2













