【问题标题】:Can I use expressions in Apache Shiro security annotations?我可以在 Apache Shiro 安全注释中使用表达式吗?
【发布时间】:2011-10-14 03:09:09
【问题描述】:

我一直在对 Apache Shiro 和 Spring Security 进行一些比较 - 我真的很喜欢 Shiro 使用的安全模型,并且相信它比 Spring Security 干净得多。

然而,一大优点是能够从方法级安全注释中引用方法参数。例如,现在我可以这样:

@RequiresPermissions("account:send:*")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }

在本示例的上下文中,这意味着经过身份验证的用户必须具有在电子邮件帐户上发送电子邮件的权限。

但是,这还不够细粒度,因为我需要实例级别的权限!在这种情况下,假设用户可以拥有电子邮件帐户实例的权限。所以,我想把前面的代码写成这样:

@RequiresPermissions("account:send:${account.id}")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }

通过这种方式,权限字符串引用传递给方法的参数,以便可以保护该方法免受特定 EmailAccount 实例的影响。

我知道我可以通过方法中的纯 Java 代码轻松地做到这一点,但是使用注释来实现同样的事情会很棒 - 我知道 Spring Security 在其注释中支持 Spring EL 表达式。

这绝对不是 Shiro 的功能,因此我必须编写自己的自定义注释吗?

谢谢,

安德鲁

【问题讨论】:

标签: spring security annotations shiro


【解决方案1】:

查看http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/aop/package-summary.html 中的类,尤其是PermissionAnnotationHandler。在那里你可以看到 Shiro 在遇到 @RequiresPermissions 注释时所做的所有事情都是调用 getSubject().isPermitted(permission) 并且根本没有在注释值内进行替换。如果您想要这种功能,则必须以某种方式覆盖该处理程序。

所以回答你的问题:是的,这绝对不是 Shiro 的一个特性,你必须编写自己的注释或以某种方式覆盖该处理程序。

【讨论】:

  • @drewzilla 我在“我的标签”视图中找到了这个 q/a,我想知道答案是否不正确。请注意,否定答案也可以是答案。您能否指出答案中是否缺少任何内容?
【解决方案2】:

【讨论】:

  • '${account.id}' 这显然是在使用 Spring 的 BeanWrapper(反射)。尽管它可能会阻止编写某些代码行恕我直言,但这并不是 Shiro 打算成为的安全框架的一部分。
  • 很好,但这还没有解决。如果我们使用的是Spring,现在有没有办法像其他Spring注解一样使用它?
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2012-08-03
  • 2017-06-10
  • 2010-09-29
  • 2016-10-17
  • 2021-04-20
  • 2020-03-22
  • 2021-10-09
相关资源
最近更新 更多