5

在 的supports(Class clazz)方法中RoleVoter,它总是返回 true 表示

此实现支持任何类型的类,因为它不查询提供的安全对象。

这是什么“提供的安全对象”。另一方面,只有当是 的子类型时,supports(Class clazz)方法WebExpressionVoter才会返回 true 。这里是“提出的安全对象”吗?为什么选民必须支持它?clazzFilterInvocationFilterInvocation

如果我@Secured在我的方法上使用注释并为作为投票者之一的全局方法安全性配置访问决策管理器WebExpressionVoter,则会出现错误

AccessDecisionManager 不支持安全对象类:接口 org.aopalliance.intercept.MethodInvocation

这是因为访问决策管理器的所有投票者(当为方法安全性配置时)必须支持上述类,而 whileRoleVoter和其他人则WebExpressionVoter需要FilterInvocation.

SPELtag中的表达式@PreAuthorize也需要WebExpressionVoter,并且再次需要支持MethodInvocation类,但它不需要。但它确实有效。那么我在这里做错了什么?

4

1 回答 1

14

secured object是一个抽象,代表任何被保护的东西。如果需要,它可以是 a MethodInvocationin case of @Secured、和,或 a in case of或任何其他对象。@RolesAllowed@PreFilter@PreAuthorizeFilterInvocation<intercept-url />

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

public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(MethodInvocation.class);
}

WebExpressionVoter是特定于 Web 调用的,因为它将 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支持两者,因此可以在两种情况下使用。

于 2012-04-11T14:47:55.557 回答