Spring安全性访问AccessDecisionVoter中的请求参数和http会话

时间:2011-03-05 18:19:29

标签: spring-security

我有一个实现Spring Security(ver 2.5)org.springframework.security.vote.AccessDecisionVoter的类。访问决策基于检查所请求的文章ID与用户http会话中保存的id列表,如果id存在,我将返回ACCESS_GRANTED

但是如何从vote()的{​​{1}}方法中获取请求参数和用户会话信息?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

了解有关您的要求和配置的更多信息会很好,但我会说AccessDecisionVoter应该将决策作为其参数所需的全部内容:

  • 身份验证对象应包含GrantedAuthorities
  • 正在保护的对象应该是您的文章
  • ConfigAttributes几乎应该是用于做出决定的任何其他信息

在你的情况下(再次,对你的系统设计不太了解),我要么去创造像

这样的东西
public class SpecificArticlesGrantedAuthority implements GrantedAuthority {
  private final Collection<Integer> grantedArticleIds;

  //Constructor

  //Getter for the IDs
}

并将其保存在您的身份验证对象中。

或者,使用PermissionEvaluator而不是AccessDecisionVoter,它更适合类似ACL的功能(但仅在Spring 3.0之后可用)

答案 1 :(得分:1)

可能更好更干净的方法是创建自己的过滤器(可以轻松访问请求对象),为该用户添加ACCESS_GRANTED GrantedAuthority。

答案 2 :(得分:0)

AccessDecisionVoter<FilterInvocation>实施时,您可以通过这种方式实现:

public class MyAccessDecisionVoter implements AccessDecisionVoter<FilterInvocation> {
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return false;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) {
        int result = ACCESS_ABSTAIN;

        HttpSession session = null;

        try {
            session = fi.getRequest().getSession(false);
        } catch (UnsupportedOperationException e) {}

        if (session != null) {
            if (sessionAttributeListContainsArticleID) {
                result = ACCESS_GRANTED;
            }
        }

        return result;
    }
}