我一直在对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的功能,因此我必须编写自己的自定义注释吗?
谢谢,
安德鲁
最佳答案
查看http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/aop/package-summary.html中的类,尤其是PermissionAnnotationHandler
。在那里,您可以看到Shiro在遇到@RequiresPermissions
批注时所做的全部工作就是调用getSubject().isPermitted(permission)
,并且在批注值内部完全没有替代项。如果您想要这种功能,就必须以某种方式覆盖该处理程序。
因此,回答您的问题:是的,这绝对不是Shiro的功能,您必须编写自己的注释或以某种方式覆盖该处理程序。
关于spring - 我可以在Apache Shiro安全注释中使用表达式吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6842616/