JASIG CAS - 每个用户帐户只允许一个会话

时间:2015-08-11 12:38:18

标签: spring spring-security single-sign-on cas

我们在JASIG CAS作为身份验证服务器的帮助下,在我们的应用程序中实现了“单点登录”。

现在我们需要一个设置,其中每个用户只能在CAS中创建一个会话/票证。

如果用户尝试从其他系统/浏览器登录,则CAS将使用户的当前故障单无效,并从之前的会话/浏览器中注销他/她。

1 个答案:

答案 0 :(得分:2)

最后,我找到了解决问题的方法。希望它能帮助别人。

Jasig Cas本身使用内存映射来跟踪为用户分配的故障单。我使用类似的方法来达到要求: -

为了实现功能,项目中添加了一些额外的功能。更改如下: -

  1. “SingleSesionTicketRegistry”类的实现,该类将地图中的会话票据维护为默认行为,但如果地图中已存在用户票证,则注册表将使前一会话无效。

  2. 修改Cas配置以使用Mysql数据库进行身份验证,其中密码为MD5哈希。

  3. 修改Cas配置以使用自定义故障单注册表而不是默认值。
  4. 以下是必须在项目中完成的配置更改: - 1. src / main / resources / application.properties

    #Toggle the feature if Single Session.
    is.single.sesion.per.user=true
    
    #MySQL query to check the authentication.
    user.authentication.sql=select password from user where email=? and is_active=1  
    

    /src/main/webapp/WEB-INF/spring-configuration/ticketRegistry.xml

    <!--Comment the default ticket regitry. -->
    <!-- <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" />  -->
    
    <!--Add the custom ticket regitry. -->
    <bean id="ticketRegistry" class="com.naval.cas.SingleSesionTicketRegistry"  
    p:isSingleSesionPerUser="${is.single.sesion.per.user}"
    p:logoutManager-ref="logoutManager"/>
    

    /src/main/webapp/WEB-INF/deployerConfigContext.xml

    <!--Add the Following code block -->
    <bean id="passwordEncoder"
      class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
      c:encodingAlgorithm="MD5"
      p:characterEncoding="UTF-8" />
    
    <bean id="primaryAuthenticationHandler"
      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
      p:dataSource-ref="dataSource"
      p:passwordEncoder-ref="passwordEncoder"
      p:sql="${user.authentication.sql}" />
    

    单会话票证注册表类可以在下面的github repo中找到。

    https://github.com/navalgandhi1989/jasig-cas-single-session/blob/master/src/main/java/com/naval/cas/SingleSesionTicketRegistry.java