【问题标题】:Apache shiro implied permissionsApache shiro 隐含权限
【发布时间】:2011-07-12 21:08:22
【问题描述】:

如果用户拥有user:edit:1 权限并且我正在使用注释驱动@RequiresPermissions("user:edit"),为什么shiro 会抛出异常?他们拥有user:edit:1这一事实不应该暗示该许可吗?如果我输入@RequriesPermissions("user:edit:1"),那么它可以正常工作,但是在操作的上下文中我不知道 1 是什么,所以稍后将在方法中检查,但我想完全避免进入该方法,如果他们根本没有user:edit 权限。

【问题讨论】:

    标签: java annotations shiro


    【解决方案1】:

    我不认为,ascandrolis 的答案是正确的,因为 Shiro 文档指出:

    但是,以下内容对于运行时检查来说不太理想:

    if (SecurityUtils.getSubject().isPermitted("printer:print")) { //print the document }

    为什么?因为第二个示例说“您必须能够打印到任何打印机才能执行以下代码块”。但请记住,“printer:print”等价于“printer:print:*”!

    (Shiro Documentation)

    所以@RequiresPermissions("user:edit:*")@RequiresPermissions("user:edit") 的含义相同,即主体需要能够编辑任何用户。

    【讨论】:

    • 请再次阅读问题,答案和文档,仔细阅读并注意措辞:用户“拥有”什么,“需要”什么以及开发人员事先知道什么信息.
    • 很抱歉,如果我的回答没有我想的那么清楚。我想说的是,“user:edit”和“user:edit:*”这两个权限是 100% 等效的,因此您使用后者的建议根本无法解决操作员接收安全异常的问题。自己尝试一下(就像我一样)。
    • 另一种选择可能类似于 this:在自定义 bean 中进行 shiro-check 并通过注释调用它,或者甚至更好:通过使用自定义 WebSecurityExpressionRoot,您可以获得访问权限到 http-request 和客户端提供的 id。
    • 我认为 ascandroli 的答案就是这么说的——“user:edit”意味着“user:edit:1”但不是相反,并且“user:edit:*”是完全相同的作为“用户:编辑”
    【解决方案2】:

    "user:edit" 暗示 "user:edit:1" 但不是相反。 您可以继续使用@RequiresPermissions("user:edit"),然后在您的方法中检查“1”。也可以使用通配符@RequiresPermissions("user:edit:*"),完全一样,但我觉得更清楚。

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 2013-09-03
      • 2013-04-26
      • 2017-06-14
      • 2013-02-26
      • 2017-11-27
      • 2021-07-30
      • 2013-06-15
      • 2015-01-24
      相关资源
      最近更新 更多