【发布时间】:2015-12-04 05:35:58
【问题描述】:
背景
大家好,
我们有使用Spring security 的Spring 项目。我们通过定义来定义安全过滤器
<b:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
filter-chain-map
在web.xml 我们这样做
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这一切都很好:)。现在,当根据doc 连接Spring session 和redis 时,接下来的几行
<context:annotation-config />
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
创建一个名为springSessionRepositoryFilter 的filter。所以基本上我们所做的就是在每个自定义filter-chain 中添加该过滤器作为第一个过滤器。即:
<b:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<filter-chain-map request-matcher="ant">
<filter-chain pattern="/api/someapieformobilelogin" filters="none" /> <!-- no filter on login -->
<filter-chain pattern="/api/**"
filters="springSessionRepositoryFilter, securityContextFilter,and some other spring security filter />
<filter-chain pattern="/**"
filters="springSessionRepositoryFilter, securityContextFilter,and some other spring security filter />
结果:该应用似乎运行良好,并且通过redis-cli 的monitoring 显示spring 正在与redis 通信。
问题
在filter-chain 中使用springSessionRepositoryFilter 可以吗?还是我们滥用了过滤系统?
谢谢,
橡木
编辑
似乎上述方法不适用于想要从代码中Authenticate 用户的情况,即
Authentication authentication = authenticationManager
.authenticate(authenticationToken);
SecurityContext securityContext = SecurityContextHolder
.getContext();
securityContext.setAuthentication(authentication);
将失败。可能是因为它不足以通过filter-chain 或org.springframework.security.web.FilterChainProxy 运行它。
你觉得在web.xml 中以filter 运行它会怎样?
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以上将强制在springSecurityFilterChain 之前运行springSessionRepositoryFilter,但在此示例中org.springframework.web.filter.DelegatingFilterProxy 被调用两次。还有其他方法可以让springSessionRepositoryFilter 在springSecurityFilterChain 过滤器之前作为过滤器运行吗?
【问题讨论】:
-
我知道这是一个老问题。 bu 你找到解决这个问题的方法了吗?我目前面临同样的问题
-
这个确实老问题,我想我可以看看答案。你还需要吗?
-
您好,谢谢您的回复。我们暂时从项目中删除了 spring-session,因为我们无法解决这个问题。如果花费太多时间,您不必搜索答案
-
嘿,我添加了对这个问题的回答。希望它可以帮助您解决问题
标签: spring-security spring-session spring-data-redis