cas配置

 

以下皆为cas服务器端的设置

cas.properties文件里的可配置项

路径: WebRoot/WEB_INF/cas.prpperties

  • server.name=http://localhost:8080 设置cas服务器的访问路径
  • server.prefix=${server.name}/cas 指定cas应用的访问前缀 默认无须改变
  • cas.securityContext.serviceProperties.service=${server.prefix}/services/j_acegi_cas_security_check 暂时不了解
  • cas.securityContext.serviceProperties.adminRoles=ROLE_ADMIN
    • cas项目使用spring security 安全框架.
    • cas有前端可访问的管理页面.只有有ROLE_ADMIN角色的人才有权限访问管理页面.
    • 管理页面访问地址: ${server.name}/cas/services/manage.html ```xml 为用户333授予ROLE_ADMIN权限

    ```

  • host.name=cas01.example.org 生产的cas服务器的域名
  • database.hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect 数据库方言
  • cas.logout.followServiceRedirects=true
    • 当你访问cas服务器带参数service 例如http://localhost:8080/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fcas%2Fservices%2Fj_acegi_cas_security_checkcas会通知浏览器重定向到service参数值对应的地址
    • cas登出的url为/cas/logout 用户发起注销登陆后,浏览器会重定向到此地址.cas服务器会显示默认的注销成功页面
    • 假设有两个应用系统,A和B 都接入了cas中央认证.想让用户在A系统登出后,跳转回A系统的页面,可以在登出url后缀上service参数.
    • 此项设置为true,代表登出后如果有参数会重定向
  • tgt.maxTimeToLiveInSeconds=32400
    • 此项代表tgt票据的存活时间
    • 单位是秒,此处代表9小时.即一个tgt最长活不过9小时
    • tgt的维护是由一个定时job去管理的.可以设置每隔多长时间进行清理. job定义在spring-configuration/ticketRegistry.xml中 ```xml
      此处每隔300000s重复清理过期的tgt   ```
    
  • tgt.timeToKillInSeconds=7200
    • 此项网上多说是用户鼠标无操作的时间,即7200s无操作即删除tgt,但不知道cas服务器是怎么知道用户无操作的
  • cas.timeToDieInSeconds=2
    • 此项是关键配置项.建议生产维持2不变.开发打断点时必须调大
    • cas接收别人的认证请求.如果在两秒内没有验证成功,为了服务的稳定性,会强行杀掉此session.避免dos攻击.
    • 开发过程,不调大,会报错.

cas-servlet.xml

deployerConfigContext.xml

  • 配置sql
      <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
          <property name="sql"><!-- 查询状态不能为0 的  0是离职 -->
              <value>select password from t_system_system_staff where login_id=? and status&lt;&gt;0</value>
          </property>
          <property name="dataSource" ref="dataSource" />
          <property name="passwordEncoder" ref="MD5PasswordEncoder" />
      </bean>
    

    配置查询语句,并加状态判断,配置MD5

  • 配置数据源
      <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
          <property name="driverClassName">
              <value>com.mysql.jdbc.Driver</value>
          </property>
          <property name="url">
              <value>jdbc:mysql://192.168.1.16:3306/eap</value>
          </property>
          <property name="username">
              <value>root</value>
          </property>
          <property name="password">
              <value>123456</value>
          </property>
      </bean>
    
    

以上是根据文件位置配置

以下是根据功能配置

使用https

WebRoot\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml文件内只有一个bean定义

如果使用https 必须将p:cookieSecure设置为true.反之若使用http,必须设置为false.否则会造成用户无法注销.

登录成功默认跳转地址

  • 如果登录验证带有service参数,成功后会定向到service的地址
  • 如果没有service参数,默认是显示登陆成功的信息.
  • cas\WebRoot\WEB-INF\login-webflow.xml内搜索<end-state id="viewGenericLoginSuccess" view="externalRedirect:http://localhost:8085" />此处使用了工作流,修改view后的地址,即可直接跳转到指定的地址.

验证码

  1. 增加jar kaptcha-2.3.2.jar(google)
  2. login-webflow.xml ```xml
3. `UsernamePasswordCredentialsHF.java` 实体类添加
```xml
<var name="credentials" 
class="com.***.cas.authentication.principal.UsernamePasswordCredentialsHF" />
  1. \cas\src\com\***\cas\web\flow\AuthenticationViaFormActionHF.java 验证action添加

    BadAuthcodeAuthenticationExceptionHF.java NullAuthcodeAuthenticationExceptionHF.java 关于验证码的两个方法

  2. casLoginView.jsp 登录界面增加验证码的div的input框
  3. 增加messages_zh_CN.properties.国际化提示

登录密码错误次数上限设置\登录日志记录

  1. cas\WebRoot\WEB-INF\spring-configuration\throttleInterceptorTrigger.xml
  2. 目前修改后的版本可以自定义设置:
     <bean id="throttleInterceptor"  
         class="com.***.cas.web.support.InMemoryThrottledSubmissionByIpAddressAndUsernameHandlerInterceptorAdapterHF" 
         //没有用到 
         p:failureRangeInSeconds="28800"    
         p:failureRangeInHours="24"
         p:failureThreshold="5"
         p:dataSource-ref="dataSource"  
         p:insertLoginLogsql="insert into t_staff_login_log values(?,?,?)"  
         p:updateErrorLoginNumSql="update t_system_system_staff set login_error_num = login_error_num+1,last_error_time=NOW() where login_id = ? "
         p:queryErrorLoginNumSql="select login_error_num,last_error_time from t_system_system_staff where login_id = ? "
         p:successSql="update t_system_system_staff set login_error_num = 0,last_error_time=null where login_id = ? " />
            
    
  3. 逻辑: 如果登录失败一次(验证码失败),不计入失败次数 如果密码错误,失败次数+1,修改最后一次的失败时间 如果登录成功,失败次数清零.最后一次失败次数为null 如果连续失败次数>=5.cas服务器判断当前时间与最后一次错误次数的差值,如果小于24小时,拒绝服务. 可在此处修改sql语句.

  4. 主要涉及类
     com.***.cas.web.support.AbstractInMemoryThrottledSubmissionHandlerInterceptorAdapterHF
     com.***.cas.web.support.AbstractThrottledSubmissionHandlerInterceptorAdapterHF
     com.***.cas.web.support.InMemoryThrottledSubmissionByIpAddressAndUsernameHandlerInterceptorAdapterHF
    

cas server 技术点

  • spring mvc
  • spring security
  • spring web flow

    票据

  • tgt-一个登录用户对应一个tgt,只存在于cas server中.
  • tgc tgt的key.由cas server 写入cookie cookie头为CASTGC 会设置httponly securi属性
  • st 一个st默认使用一次就会销毁
  • 还有其他票据用于更复杂的代理网络等.