gpt4 book ai didi

Spring security - 为什么 RoleVoter 支持所有类而 WebExpressionVoter 只支持 FilterInvocation 的子类?

转载 作者:行者123 更新时间:2023-12-04 16:48:26 24 4
gpt4 key购买 nike

supports(Class clazz) RoleVoter的方法,它总是返回 true 说

This implementation supports any type of class, because it does not query the presented secure object.



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

如果我使用 @Secured对我的方法进行注释,并为具有 WebExpressionVoter 的全局方法安全性配置访问决策管理器作为选民之一,它提出了一个错误

AccessDecisionManager does not support secure object class: interface org.aopalliance.intercept.MethodInvocation



这是因为访问决策管理器的所有投票者(当配置为方法安全性时)必须支持上述类,而 RoleVoter和其他人一样, WebExpressionVoter需要 FilterInvocation 的子类型.
SPEL @PreAuthorize 中的表达式标签也需要 WebExpressionVoter ,再次需要支持 MethodInvocation类,它没有。但它确实有效。那么我在这里做错了什么?

最佳答案

secured object是一个抽象,代表任何 protected 东西。可能是 MethodInvocation@Secured 的情况下, @RolesAllowed , @PreFilter@PreAuthorize ,或 FilterInvocation<intercept-url /> 的情况下或任何其他对象(如果需要)。
@PreFilter@PreAuthorize注释由 PreInvocationAuthorizationAdviceVoter 处理.它使用 MethodInvocation获取注释及其属性值,因此它具有:

public boolean supports(Class<?> clazz) {
return clazz.isAssignableFrom(MethodInvocation.class);
}
WebExpressionVoter是特定于网络调用的,因为它将 URL 与来自 <intercept-url /> 的模式相匹配,这就是为什么它有:
public boolean supports(Class<?> clazz) {
return clazz.isAssignableFrom(FilterInvocation.class);
}
RoleVoter仅使用 Authentication对象内容,所以它不依赖于 secured object ,这就是为什么它有:
public boolean supports(Class<?> clazz) {
return true;
}

请注意,您可以有一个单独的 AccessDecisionManager用于 URL 级安全和方法级安全。第一个将使用支持 FilterInvocation 的选民, 其他支持 MethodInvocation .另请注意 RoleVoter支持两者,因此它可以在两种情况下使用。

关于Spring security - 为什么 RoleVoter 支持所有类而 WebExpressionVoter 只支持 FilterInvocation 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10107278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com