Spring安全性 - 为什么RoleVoter支持所有类,而WebExpressionVoter只支持FilterInvocation的子类?

时间:2012-04-11 13:48:41

标签: spring spring-security spring-3

supports(Class clazz)的{​​{1}}方法中,它始终返回true,表示

  

此实现支持任何类型的类,因为它不支持   查询呈现的安全对象。

这是什么" 呈现的安全对象"。另一方面,仅当RoleVotersupports(Class clazz)的子类型时,WebExpressionVoter clazz方法才会返回true。是FilterInvocation"呈现的安全对象"这里以及为什么选民必须支持它?

如果我对我的方法使用FilterInvocation注释并为具有@Secured作为选民之一的全局方法安全性配置访问决策管理器,则会出现错误

  

AccessDecisionManager不支持安全对象类:interface   org.aopalliance.intercept.MethodInvocation

这是因为访问决策管理器的所有选民(在配置方法安全性时)必须支持上述类,而WebExpressionVoter和其他人一样,RoleVoter需要WebExpressionVoter的子类型}。

FilterInvocation标记中的

SPEL表达式也需要@PreAuthorize,并且还需要支持WebExpressionVoter类,而不是MethodInvocation类。但它确实有效。那么我在这里出错了什么?

1 个答案:

答案 0 :(得分:14)

secured object是一个表示任何安全的摘要。在MethodInvocation@Secured@RolesAllowed@PreFilter的情况下可能是@PreAuthorize,如果是{{1},则可能是FilterInvocation或者任何其他对象(如果需要)。

<intercept-url />@PreFilter注释由@PreAuthorize处理。它使用PreInvocationAuthorizationAdviceVoter来获取注释及其属性值,因此它具有:

MethodInvocation

public boolean supports(Class<?> clazz) { return clazz.isAssignableFrom(MethodInvocation.class); } 是特定于网络调用的,因为它匹配来自WebExpressionVoter的模式的网址,这就是它具有的原因:

<intercept-url />

public boolean supports(Class<?> clazz) { return clazz.isAssignableFrom(FilterInvocation.class); } 仅使用RoleVoter对象内容,因此它不依赖于Authentication,这就是它的原因:

secured object

请注意,您可以为URL级安全性和方法级安全性单独public boolean supports(Class<?> clazz) { return true; } 。第一个将使用支持AccessDecisionManager的选民,另一个支持FilterInvocation的支持者。另请注意,MethodInvocation支持两者,因此可以在两种情况下使用它。