1. 介绍

提供单点登录的CAS集成

干净的Cas 3.5.3服务器,可使用admin/admin或user/user登录

2. 使用

(1)使用在线initilizer工具时,需要选择添加

    implementation('org.yunchen.gb:gb-plugin-springsecurity-cas:1.4.0.0.M1')

(2)application.yml 配置 假设本机的80端口部署了CAS服务器

gb:
    cas:
      active: true
      encoding: UTF-8
      loginUri: /login #支持使用http://https://的完整地址,其余的情况会前置serverUrlPrefix地址
      serverUrlPrefix: http://localhost/cas
      serviceUrl: http://localhost:8080/project/login/auth
      filterProcessesUrl: /login/auth
      #proxyssl
      #proxyCallbackUrl: http://localhost:8080/project/secure/receptor
      #proxyReceptorUrl: /secure/receptor
      #SingleSignoutssl
      useSingleSignout: true
      serverUrlEncoding: UTF-8
      key: gb-spring-security-cas
      artifactParameter: ticket
      serviceParameter: service
      sendRenew: false

(3)startup 上的修改 需要在starup类上增加方法

   //验证用户之前调用
    public String onCasChangeUsernameBeforeAuthentication(String username){
        return username;
    }
    //若验证时本地应用库无此用户名时调用
    public BaseUser onCasNoStackUsernameNotFoundAfterAuthentication(String username, boolean loadRoles){
        //if(username != CasAuthenticationFilter.CAS_STATEFUL_IDENTIFIER && username !=CasAuthenticationFilter.CAS_STATELESS_IDENTIFIER){
        //    BaseUser baseUser=new BaseUser(username:username,password: username,realname:username,enabled:true);
        //    baseUser.save(flush:true);
        //    return baseUser;
        //}
    }
    //当登录验证成功后调用
    public void onCasAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, CasAuthenticationToken authentication) throws IOException, ServletException {
        //当前登录用户名
        println authentication.principal.username
        //额外信息
        println authentication.assertion.principal.attributes
    }

(4)单点登出配置 因为当前插件是与springsecurity插件配合使用的,需要修改springsecurity的配置部分。 注意:CAS要求统一登出功能必须将cas服务器配置为ssl方式访问

gb:
   springsecurity:
     logout:
        afterLogoutUrl: https://localhost/cas/logout?url=http://localhost:8080/project

3. 注意事项

修改requestmap中的设置,需要保护 /login/** 的访问,防止用户从本地登录

new Requestmap(url: '/login/**', configAttribute: 'isFullyAuthenticated()',authorityType: 'isFullyAuthenticated()').save(flush: true);

4. Cas服务器部分-用户校验及密码加密

修改 deployerConfigContext.xml 文件,注意选择与当前应用相同的密码加密方式,如下例所示

                <property name="authenticationHandlers">
                        <list>
                                <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
                                        p:httpClient-ref="httpClient" />
                                <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                                        <property name="sql" value="select password from base_user where username=?" />
                                        <property name="passwordEncoder">
                                                <bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
                                                        <constructor-arg value="SHA-256" />
                                                        <property name="characterEncoding" value="UTF-8"></property>
                                                </bean>
                                        </property>
                                        <property name="dataSource" ref="dataSource" />
                                </bean>
                        </list>
                </property>
        </bean>
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
            <property name="driverClassName"><value>org.h2.Driver</value></property>
            <property name="url"><value>jdbc:h2:./casDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE</value></property>
            <property name="username"><value>sa</value></property>
            <property name="password"><value></value></property>
    </bean>

5. Cas服务器部分-多增属性

修改cas服务器的casServiceValidationSuccess.jsp文件,可参考如下文章 参看 配置多增属性 在startup类的onCasAuthenticationSuccess方法中进行持久化处理

6. Cas服务器部分-Proxy callback 问题

Proxy authortication需要ssl 链接, 参看 剖析CAS Proxy的设计原理

7. 关于CAS服务器增加Oauth2的支持

cas从3.5.2 版本后增加了oauth2的支持,详细文档参见OAuth Protocol 可选择oauth2 server或client两种模式。

针对cas4或5版本,建议使用github工程cas-gradle-overlay-template构建war包

8. 事件订阅

内部安全事件AppSecurityCasAuthSuccessEvent、AppSecurityCasAuthFailureEvent都是安全事件基类AppSecurityEvent的子类。

详细订阅细节可参看eaSpringSecurity.html的事件订阅部分