Spring 我可以在ApacheShiro安全注释中使用表达式吗?

Spring 我可以在ApacheShiro安全注释中使用表达式吗?,spring,security,annotations,shiro,Spring,Security,Annotations,Shiro,我一直在比较ApacheShiro和Spring安全性——我非常喜欢Shiro使用的安全模型,并且相信它比Spring安全性更干净 然而,一个大的好处是能够从方法级安全注释中引用方法参数。例如,现在我可以这样做: @RequiresPermissions("account:send:*") public void sendEmail( EmailAccount account, String to, String subject, String message) { ... } 在本例的上下文

我一直在比较ApacheShiro和Spring安全性——我非常喜欢Shiro使用的安全模型,并且相信它比Spring安全性更干净

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

@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的一个特性,因此我必须编写自己的自定义注释吗

谢谢

Andrew

查看中的类,尤其是
PermissionAnnotationHandler
。在这里,您可以看到Shiro遇到
@requirepermissions
注释时所做的一切都是call
getSubject().isPermitted(permission)
,并且在注释值内根本不进行替换。如果需要这种功能,您必须以某种方式重写该处理程序


所以要回答您的问题:是的,这绝对不是Shiro的功能,您必须编写自己的注释或以某种方式重写该处理程序。

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


您是否创建了新的功能请求?多人为此添加了新功能请求。例如:@drewzilla我在“我的标签”视图中找到了这个q/a,我想知道答案是否正确。请注意,否定答案也可以是否定答案。您能指出答案中是否缺少任何内容吗?“${account.id}”这显然是在使用Spring的BeanRapper(反射)。虽然它可能会阻止一些代码行被写入IMHO,但这并不是Shiro想要的安全框架的一部分。很好,但这还不是固定的。如果我们使用的是Spring,现在有没有办法像其他Spring注释一样使用它?