如何使用Spring Session + Spring安全xml配置和乘法安全过滤器

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 sessionredis根据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-chainorg.springframework.security.web.FilterChainProxy.

您如何看待上运行它filterweb.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

Rob*_*nch 1

不要紧。来自Javadoc

SessionRepositoryFilter 必须放置在任何访问 HttpSession 或可能提交响应的 Filter 之前,以确保会话被覆盖并正确保留。

只要您springSessionRepositoryFilter在可以提交响应或访问的任何内容之前添加HttpSession,就可以了。对于 Spring Security,您需要确保的主要事情是springSessionRepositoryFilterSecurityContextPersistenceFilter. springSessionRepositoryFilter这可以通过包含在容器内或 Spring Security 内FilterChainProxy(即)来完成<filter-chain>