oak*_*oak 6 spring-security spring-data-redis spring-session
嘿所有,我们有Spring使用的项目Spring security.我们通过定义来定义安全过滤器
<b:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
Run Code Online (Sandbox Code Playgroud)
蒙山 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>
Run Code Online (Sandbox Code Playgroud)
这一切都很好:).现在挂钩时,Spring session与redis根据doc 下届行
<context:annotation-config />
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
Run Code Online (Sandbox Code Playgroud)
创建一个filter命名springSessionRepositoryFilter.基本上我们所做的就是在每个自定义中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 />
Run Code Online (Sandbox Code Playgroud)
结果:该应用似乎运作良好,也monitoring通过redis-cli显示spring正在与之沟通redis.
springSessionRepositoryFilter里面的使用是否filter-chain可以?或者我们滥用过滤系统?
谢谢,
橡木
看来上面的内容不适用于Authenticate从代码中想要用户的情况
Authentication authentication = authenticationManager
.authenticate(authenticationToken);
SecurityContext securityContext = SecurityContextHolder
.getContext();
securityContext.setAuthentication(authentication);
Run Code Online (Sandbox Code Playgroud)
会失败的.也许是因为它没有足够的通过运行它filter-chain的org.springframework.security.web.FilterChainProxy.
您如何看待上运行它filter的web.xml?
<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>
Run Code Online (Sandbox Code Playgroud)
以上将强制运行springSessionRepositoryFilter,springSecurityFilterChain但在此示例org.springframework.web.filter.DelegatingFilterProxy中被调用两次.springSessionRepositoryFilter在过滤之前使其作为过滤器运行的任何其他方法springSecurityFilterChain?
不要紧。来自Javadoc:
SessionRepositoryFilter 必须放置在任何访问 HttpSession 或可能提交响应的 Filter 之前,以确保会话被覆盖并正确保留。
只要您springSessionRepositoryFilter在可以提交响应或访问的任何内容之前添加HttpSession,就可以了。对于 Spring Security,您需要确保的主要事情是springSessionRepositoryFilter在SecurityContextPersistenceFilter. springSessionRepositoryFilter这可以通过包含在容器内或 Spring Security 内FilterChainProxy(即)来完成<filter-chain>。
| 归档时间: |
|
| 查看次数: |
4937 次 |
| 最近记录: |