我有一个实现Spring Security(ver 2.5)org.springframework.security.vote.AccessDecisionVoter
的类。访问决策基于检查所请求的文章ID与用户http会话中保存的id列表,如果id存在,我将返回ACCESS_GRANTED
。
但是如何从vote()
的{{1}}方法中获取请求参数和用户会话信息?
任何帮助表示感谢。
答案 0 :(得分:2)
了解有关您的要求和配置的更多信息会很好,但我会说AccessDecisionVoter应该将决策作为其参数所需的全部内容:
在你的情况下(再次,对你的系统设计不太了解),我要么去创造像
这样的东西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;
}
}