在RoleVoter的支持(Class clazz)方法中,它总是返回true表示
This implementation supports any type of class,because it does not
query the presented secure object.
什么是“呈现的安全对象”.另一方面,仅当clazz是FilterInvocation的子类型时,WebExpressionVoter的supports(Class clazz)方法才返回true. FilterInvocation是“提供的安全对象”,为什么选民必须支持它?
如果我对我的方法使用@Secured注释并为具有WebExpressionVoter作为选民之一的全局方法安全性配置访问决策管理器,则会出现错误
AccessDecisionManager does not support secure object class: interface
org.aopalliance.intercept.MethodInvocation
这是因为访问决策管理器的所有选民(当配置为方法安全性时)必须支持上述类,而RoleVoter和其他人一样,WebExpressionVoter需要FilterInvocation的子类型.
@PreAuthorize标记中的SPEL表达式也需要WebExpressionVoter,并且需要再次支持MethodInvocation类,而不需要它.但它确实有效.那我在这里错了什么?
@PreFilter和@PreAuthorize注释由PreInvocationAuthorizationAdviceVoter处理.它使用MethodInvocation来获取注释及其属性值,因此它具有:
public boolean supports(Class> clazz) {
return clazz.isAssignableFrom(MethodInvocation.class);
}
WebExpressionVoter是特定于Web调用的,因为它匹配来自< intercept-url />的模式的URL,这就是它具有的原因:
public boolean supports(Class> clazz) {
return clazz.isAssignableFrom(FilterInvocation.class);
}
RoleVoter仅使用Authentication对象内容,因此它不依赖于安全对象,这就是它具有以下内容的原因:
public boolean supports(Class> clazz) {
return true;
}
请注意,您可以使用单独的AccessDecisionManager来实现URL级别安全性和方法级别安全性.第一个将使用支持FilterInvocation的选民,另一个支持MethodInvocation.另请注意,RoleVoter支持两者,因此可以在两种上下文中使用它.