在supports(Class clazz)
的{{1}}方法中,它始终返回true,表示
此实现支持任何类型的类,因为它不支持 查询呈现的安全对象。
这是什么" 呈现的安全对象"。另一方面,仅当RoleVoter
是supports(Class clazz)
的子类型时,WebExpressionVoter
clazz
方法才会返回true。是FilterInvocation
"呈现的安全对象"这里以及为什么选民必须支持它?
如果我对我的方法使用FilterInvocation
注释并为具有@Secured
作为选民之一的全局方法安全性配置访问决策管理器,则会出现错误
AccessDecisionManager不支持安全对象类:interface org.aopalliance.intercept.MethodInvocation
这是因为访问决策管理器的所有选民(在配置方法安全性时)必须支持上述类,而WebExpressionVoter
和其他人一样,RoleVoter
需要WebExpressionVoter
的子类型}。
FilterInvocation
标记中的 SPEL
表达式也需要@PreAuthorize
,并且还需要支持WebExpressionVoter
类,而不是MethodInvocation
类。但它确实有效。那么我在这里出错了什么?
答案 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
支持两者,因此可以在两种情况下使用它。