35

我一直在对 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 的功能,因此我必须编写自己的自定义注释吗?

谢谢,

安德鲁

4

2 回答 2

8

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

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

于 2012-08-24T13:03:31.723 回答
3

Shiro 目前不支持此功能。多人请求此功能。也许我们可以为这个问题投票?

https://issues.apache.org/jira/browse/SHIRO-484

https://issues.apache.org/jira/browse/SHIRO-77

https://issues.apache.org/jira/browse/SHIRO-417

https://issues.apache.org/jira/browse/SHIRO-331

于 2015-12-14T02:42:03.097 回答