当前位置 主页 > 网站技术 > 代码类 >

    Spring Security实现禁止用户重复登陆的配置原理

    栏目:代码类 时间:2019-12-11 18:10

    这篇文章主要介绍了Spring Security实现禁止用户重复登陆的配置原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    系统使用了Spring Security做权限管理,现在对于系统的用户,需要改动配置,实现无法多地登陆。

    一、SpringMVC项目,配置如下:

    首先在修改Security相关的XML,我这里是spring-security.xml,修改UsernamePasswordAuthenticationFilter相关Bean的构造配置

    加入

    <property name="sessionAuthenticationStrategy" ref="sas" />

    新增sas的Bean及其相关配置

    <bean  class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
        <constructor-arg>
          <list>
            <bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
              <constructor-arg ref="sessionRegistry"/>
              <!-- 这里是配置session数量,此处为1,表示同一个用户同时只会有一个session在线 --> 
              <property name="maximumSessions" value="1" />
              <property name="exceptionIfMaximumExceeded" value="false" />
            </bean>
            <bean class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy">
            </bean>
            <bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy">
              <constructor-arg ref="sessionRegistry"/>
            </bean>
          </list>
        </constructor-arg>
      </bean>
    
      <bean 
            class="org.springframework.security.core.session.SessionRegistryImpl" />

    加入ConcurrentSessionFilter相关Bean配置

    <bean 
            class="org.springframework.security.web.session.ConcurrentSessionFilter">
        <constructor-arg name="sessionRegistry" ref="sessionRegistry" />
        <constructor-arg name="sessionInformationExpiredStrategy" ref="redirectSessionInformationExpiredStrategy" />
      </bean>
    
    
      <bean 
            class="org.springframework.security.web.session.SimpleRedirectSessionInformationExpiredStrategy">
        <constructor-arg name="invalidSessionUrl" value="/login.html" />
      </bean>

    二、SpringBoot项目

    三、Bean配置说明

    SessionAuthenticationStrategy:该接口中存在onAuthentication方法用于对新登录用户进行session相关的校验。 查看UsernamePasswordAuthenticationFilter及其父类代码,可以发现在doFilter中存在sessionStrategy.onAuthentication(authResult, request, response);方法 但UsernamePasswordAuthenticationFilter中的sessionStrategy对象默认为NullAuthenticatedSessionStrategy,即不对session进行相关验证。 如本文配置,建立id为sas的CompositeSessionAuthenticationStrategy的Bean对象。 CompositeSessionAuthenticationStrategy可以理解为一个托管类,托管所有实现SessionAuthenticationStrategy接口的对象,用来批量托管执行onAuthentication函数 这里CompositeSessionAuthenticationStrategy中注入了三个对象,关注ConcurrentSessionControlAuthenticationStrategy,它实现了对于session并发的控制 UsernamePasswordAuthenticationFilter的Bean中注入新配置的sas,用于替换原本的NullAuthenticatedSessionStrategy ConcurrentSessionFilter的Bean用来验证session是否失效,并通过SimpleRedirectSessionInformationExpiredStrategy将失败访问进行跳转。