介绍

用户登录成功之后,被访问的业务系统需要在当前用户有访问请求时(在线状态) 每间隔一段时间(默认 5分钟) 向认证中心提交用户在线状态信息,保证认证中心能够感知到用户当前的活动状态,可以通过集成Redis存储TGT完成。

  1. <dependency>
  2. <groupId>org.apereo.cas</groupId>
  3. <artifactId>cas-server-support-redis-ticket-registry</artifactId>
  4. <version>${cas.version}</version>
  5. </dependency>

Cas Server 登录成功后,将所有的信息都存在了以TGT对应的对象中,只需要保证TGT的对象存活即可保证认证中心会话的存活。
image.png

可以看到redis中TGT的key以 “CAS_TICKET:”为前缀,并且设置了过期时间,当TGT过期时,redis会自动删除TGT的数据,此时用户携带TGC再次访问认证中心服务端时,认证中心会引导用户进行登录,根据以上推理,客户端只需要拿到TGT定时调用用户中心提供的心跳接口,由用户中心重置TGT对应的有效期即可完成认证中心续签的需求,但是认证中心在认证成功后返回给客户端应用没有包含TGT,因此需要修改不同协议认证中心认证后返回的数据格式,新增一个TGT即可,由客户端进行存储TGT并使用该TGT进行心跳发送。

<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
    <cas:authenticationSuccess>
        <cas:user>admin</cas:user>
        <cas:tgt>TGT-2-V5P4F7Hg70ZkdvCNM1h5Tn0FVcrc968Kx0fBYvjB-63r4kit5mNNBW0QAqHRW08Md9Qtest-gc-starter-ac-69bfc445c4-8mqxl</cas:tgt>
        <cas:attributes>
            <cas:samlAuthenticationStatementAuthMethod>urn:oasis:names:tc:SAML:1.0:am:password</cas:samlAuthenticationStatementAuthMethod>
            <cas:credentialType>UsernamePasswordCredential</cas:credentialType>
            <cas:isFromNewLogin>true</cas:isFromNewLogin>
            <cas:authenticationDate>2022-01-24T13:48:17.571+08:00[Asia/Shanghai]</cas:authenticationDate>
            <cas:authenticationMethod>QueryDatabaseAuthenticationHandler</cas:authenticationMethod>
            <cas:successfulAuthenticationHandlers>QueryDatabaseAuthenticationHandler</cas:successfulAuthenticationHandlers>
            <cas:longTermAuthenticationRequestTokenUsed>false</cas:longTermAuthenticationRequestTokenUsed>
            </cas:attributes>
    </cas:authenticationSuccess>
</cas:serviceResponse>

心跳接口

接口地址: http://uc.com/app/heartbeat
方法: POST
Content-Type: application/json
请求报文

{
    "tgt": "xxxxx"
}