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

前端之家收集整理的这篇文章主要介绍了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支持两者,因此可以在两种上下文中使用它.

猜你在找的Spring相关文章