微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在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类,而不需要它.但它确实有效.那我在这里错了什么?

最佳答案
受保护对象是表示受保护的任何内容摘要.对于@ Secure,@ RolesAllowed,@ PreFilter和@PreAuthorize,它可以是MethodInvocation,如果是< intercept-url />,则可以是FilterInvocation.或者任何其他物品(如果需要)

@PreFilter和@PreAuthorize注释由PreInvocationAuthorizationAdviceVoter处理.它使用MethodInvocation来获取注释及其属性值,因此它具有:

public boolean supports(Class

WebExpressionVoter是特定于Web调用的,因为它匹配来自< intercept-url />的模式的URL,这就是它具有的原因:

public boolean supports(Class

RoleVoter仅使用Authentication对象内容,因此它不依赖于安全对象,这就是它具有以下内容的原因:

public boolean supports(Class

请注意,您可以使用单独的AccessDecisionManager来实现URL级别安全性和方法级别安全性.第一个将使用支持FilterInvocation的选民,另一个支持MethodInvocation.另请注意,RoleVoter支持两者,因此可以在两种上下文中使用它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐