springSecurity 整合 springSession问题

springSecurity 整合 springSession【解决:spring-session和security同时配置时不生效问题】
  1. springSecurity 实现登录认证
  2. spring-session-data-redis 来实现session共享

环境描述:spring.version4.2.1 、security.version3.1.3

问题描述:登录认证正常,但用户登录信息未存储到redis中

web.xml配置
   <!-- 权限  Spring Security3.1 的权限过滤
        filter-name 配置:
        配置springSecurityFilterChain :user登录信息未自动存储redis中,授权正常
        配置springSessionRepositoryFilter :user登录信息可以自动存储redis中,但授权有问题
   -->
   <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>
解决方案:

创建配置类来实现另一个(web.xml的springSecurityFilterChain也可以通过配置类实现AbstractSecurityWebApplicationInitializer)

package com.spt.framework.config;
import  org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;
/**
*
* @ClassName: SecurityInitializer
* @Description:TODO(通过继承AbstractHttpSessionApplicationInitializer类,
* 我们确保了springSessionRepositoryFilter在springSecurityFilterChain之前调用)
*
* @author zs
* @company XDF
* @version 1.0
* @date: 2020年7月31日 下午1:47:33
*/
public class SecurityInitializer extends  AbstractHttpSessionApplicationInitializer {
}
配置类原理分析:

web 容器启动时会自行去寻找类路径下所有实现了 WebApplicationInitializer 接口的 Initializer 实例,并调用他们的 onStartup 方法。
所以,我们只需要继承 AbstractHttpSessionApplicationInitializer ,便可以自动触发 web 容器的加载,进而配置springSessionRepositoryFilte ,并实例化DelegatingFilterProxy ;
然后 作为一个 Filter 正式注册到了 web 容器中。

源码:
@Order(100)
public abstract class  AbstractHttpSessionApplicationInitializer implements  WebApplicationInitializer {
     private static final String SERVLET_CONTEXT_PREFIX =  "org.springframework.web.servlet.FrameworkServlet.CONTEXT.";
     public static final String DEFAULT_FILTER_NAME =  "springSessionRepositoryFilter";
     private final Class<?>[] configurationClasses;

     /**
      * Registers the springSessionRepositoryFilter
      * @param servletContext the {@link ServletContext}
      */
     private void  insertSessionRepositoryFilter(ServletContext  servletContext) {
          String filterName = DEFAULT_FILTER_NAME;
          DelegatingFilterProxy  springSessionRepositoryFilter = new  DelegatingFilterProxy(filterName);
          String contextAttribute =  getWebApplicationContextAttribute();
          if(contextAttribute != null) {
              springSessionRepositoryFilter.setContextAttribute(contextAttribute);
          }
          registerFilter(servletContext, true, filterName,  springSessionRepositoryFilter);
     }
          ......
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值