思路讲解:
1. cas 可以将 TGT 存储到redis或者mysql. 这个TGT 是带有时间的
2. cas 开启监控页面后可以获取 st 和 TGT 的绑定信息
3. 用户登陆时,会携带 st 到 gateway
通过以上三点, 可以绑定一个自定义的token 给前端, 然后绑定到cas 存储到redis 的TGT,并将失效时间设置一致,这样每次
用户登陆都去查询是否为同一个TGT 颁发,来给前端不同的token,来实现单点登陆
1. 将cas的TGT 存储到redis
引入jar
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-redis-ticket-registry</artifactId>
<version>${cas.version}</version>
</dependency>
添加配置
cas.ticket.registry.redis.host=localhost
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6380
cas.ticket.registry.redis.password=123456
cas.ticket.registry.redis.timeout=20000
cas.ticket.registry.redis.useSsl=false
cas.ticket.registry.redis.usePool=false
重启cas 即可
2. cas 开启监控页面后可以获取 st 和 TGT 的绑定信息
#是否开启json识别功能,默认为false
cas.serviceRegistry.initFromJson=true
#忽略https安全协议,使用 HTTP 协议
cas.tgc.secure=false
#安全管理页访问时要校验的IP地址。例如设置成127.0.0.1那么在浏览器中只能用127.0.0.1来访问,即使用localhost也是无权限访问的。
#这样做的用意是保护安全管理页的访问权限。此项默认是注释掉的,默认值为127\.0\.0\.1,这里需要将其打开,否则是访问不到的。
cas.adminPagesSecurity.ip=127.0.0.1
#管理上下文路径,默认为/status。
management.contextPath=/status
#是否开启管理安全,默认为true
#management.security.enabled=false
##管理安全用户角色,默认为ACTUATOR,ADMIN
#management.security.roles=ACTUATOR,ADMIN
##是否管理安全会话,默认为if_required
#management.security.sessions=if_required
#节点开关配置(全局)
cas.monitor.endpoints.enabled=true
cas.monitor.endpoints.sensitive=false
开启cas监控页面后访问: http://127.0.0.1:8080/cas/status/dashboard
3. 绑定 ST 和 TGT
用户登陆成功之后会携带ST
访问: http://127.0.0.1:8080/cas/login?service=https://www.baidu.com
登陆成功后跳转:
https://www.baidu.com/?ticket=ST-1-PDlb5yvZWvKOaDNu52dKy1V7ug4xxx
获取本次登陆的 ST: ST-1-PDlb5yvZWvKOaDNu52dKy1V7ug4xxx
访问cas 接口: http://127.0.0.1:8080/cas/status/ssosessions/getSsoSessions
获取返回的json:
此处可以获取 st 和 tgt 可以正常绑定
查看es中存储得 TGT
{
"totalUsageCount": 1,
"activeSsoSessions": [
{
"authentication_date": 1637035502.546000000,
"authentication_date_formatted": "2021-11-16T12:05:02Z",
"authentication_attributes": {
"credentialType": [
"RememberMeUsernamePasswordCredential"
],
"authenticationMethod": [
"QueryDatabaseAuthenticationHandler"
],
"successfulAuthenticationHandlers": [
"QueryDatabaseAuthenticationHandler"
]
},
"authenticated_principal": "admin",
"number_of_uses": 1,
"ticket_granting_ticket": "TGT-1-L2ebMqhKuYfx29PE6yR7ilnCLc50mS0SePlHqtl8lJj0zjOHWsb9uCZjQwAUii-6m-Ixxx",
"principal_attributes": {},
"is_proxied": false,
"authenticated_services": {
"ST-1-PDlb5yvZWvKOaDNu52dKy1V7ug4xxx": {
"id": "https://www.baidu.com",
"originalUrl": "https://www.baidu.com",
"artifactId": null,
"principal": "admin",
"source": "service",
"loggedOutAlready": false,
"format": "XML"
}
}
}
],
"totalTicketGrantingTickets": 1,
"totalTickets": 1,
"totalPrincipals": 1,
"totalProxyGrantingTickets": 0
}
cas存储得TGT, 这个是存在TTL的
至此可以token 和 tgt 绑定,之后可以按照自己的逻辑实现.