Spring security Spring security在AccessDecisionVoter中访问请求参数和http会话

Spring security Spring security在AccessDecisionVoter中访问请求参数和http会话,spring-security,Spring Security,我有一个类实现了Spring安全性(2.5版)org.springframework.Security.vote.AccessDecisionVoter。访问决定基于根据用户http会话中保存的id列表检查请求的文章id。如果id存在,我将返回access\u grated 但是如何从accessDecisionVoter的vote()方法中获取请求参数和用户会话信息呢 感谢您的帮助。一种更好、更干净的方法可能是创建您自己的过滤器(可以轻松访问请求对象),为该用户添加授予的访问权限 更好地了解您

我有一个类实现了Spring安全性(2.5版)
org.springframework.Security.vote.AccessDecisionVoter
。访问决定基于根据用户http会话中保存的id列表检查请求的文章id。如果id存在,我将返回
access\u grated

但是如何从
accessDecisionVoter
vote()
方法中获取请求参数和用户会话信息呢


感谢您的帮助。

一种更好、更干净的方法可能是创建您自己的过滤器(可以轻松访问请求对象),为该用户添加授予的访问权限

更好地了解您的需求和配置,但我要说的是,AccessDecisionVoter应该获得决策所需的所有参数:

  • 身份验证对象应包含授权权限
  • 被保护的对象应该是您的文章
  • ConfigAttributes应该是用于做出决策的任何附加信息
在您的情况下(同样,我对您的系统的设计不太了解),我会选择

public class SpecificArticlesGrantedAuthority implements GrantedAuthority {
  private final Collection<Integer> grantedArticleIds;

  //Constructor

  //Getter for the IDs
}
public类specificArticlesGrandedAuthority实现GrandedAuthority{
私人最终收藏授权物品ID;
//建造师
//IDs的Getter
}
并将其保存在身份验证对象中


或者,使用PermissionEvaluator而不是AccessDecisionVoter,它更适合于类似ACL的功能(但仅从Spring 3.0开始提供)

AccessDecisionVoter
实现时,您可以通过以下方式获得它:

公共类MyAccessDecisionVoter实现AccessDecisionVoter{
@凌驾
公共布尔支持(ConfigAttribute){
返回false;
}
@凌驾
公共布尔支持(类clazz){
返回true;
}
@凌驾
公共整数投票(身份验证、筛选器职业fi、集合属性){
int result=访问\弃权;
HttpSession=null;
试一试{
session=fi.getRequest().getSession(false);
}捕获(不支持操作异常){}
if(会话!=null){
if(SessionAttributeListContainesArticleId){
结果=允许访问;
}
}
返回结果;
}
}

谢谢您的回复。你有任何例子来说明这一点吗?如果我添加了被授予的访问权,我将需要在请求结束时撤销它。问题是用户只对他们发起的文档拥有编辑权限,而不是现在。在您关于撤销权限的评论中,这对于过滤器来说是完美的,因为他们“包装”了请求,这样您就可以在调用filterChain.doFilter后直接撤销请求。