春季安全访问决策选民投票方法中对象参数的实际类型是什么

Los*_*can 3 java spring-security

我目前正在Spring中开发一个简单的基于角色的访问控制.我正在使用AccessDecisionVoter的实现.所以我想知道什么是Object o参数

public int vote(Authentication authentication, Object o, Collection<ConfigAttribute> configAttributes) { 
Run Code Online (Sandbox Code Playgroud)

方法?Spring文档称它是"安全对象".我使用intercept-urls并且这个选民被调用,所以它是一个控制器吗?或者只是一串网址?

提前致谢.

Xae*_*ess 6

如果您使用的是Spring Security 3.1 AccessDecisionVoter应该已经是通用的,<S>参数在投票方法中用作第二个参数.您可以浏览AccessDecisionVoter实现源代码(例如WebExpressionVoter,实现AccessDecisionVoter<FilterInvocation>)以理解该概念.其中一些实现使用Object作为通用参数,因为它们根本不需要使用安全对象(例如RoleVoter).

在您的情况下,您可能需要的是覆盖supports(Class<?>)方法(来自docs:它指示AccessDecisionVoter实现是否能够为指示的安全对象类型提供访问控制投票.)以获得FilterInvokation安全对象,如WebExpressionVoter:

@Override
public boolean supports(Class<?> clazz) {
    return clazz.isAssignableFrom(FilterInvocation.class);
}
Run Code Online (Sandbox Code Playgroud)

然后你的投票实施可能是:

@Override
public int vote(Authentication authentication, FilterInvocation fi,
    Collection<ConfigAttribute> attributes) {
  String url = fi.getRequestUrl();
  // rest of code, you can also fetch request / response from fi
Run Code Online (Sandbox Code Playgroud)