https://apereo.github.io/cas/5.3.x/installation/Configuring-Ticketing-Components.html
ticket : 访问令牌
ticket 需要配置2种组件
1,TicketRegistry
ticket存储
2,ExpirationPolicy
提供一种ticket的过期策略
首先介绍ticket过期策略
CAS支持多种策略框架来控制ticket的过期。不管ticket使用了何种分发方式:
ticket-granting tickets TGT
proxy-granting tickets PGT
services tickets ST
proxy tickets PT
说明:CAS集成了多种可选组件,每种组件都有一个TICKET的抽象。每种协议或组件也行会引入一种新的TICKET类型,会有各自的过期策略。所以选择某种组件时需要自己阅读相关文档
ticket-granting ticket策略
简单来说 就是用户已经授权了。 使用一个未过期的TICKET来重新请求新TICKET时不需要重新授权,如果使用了已经过期的,需要重新授权登录。 类似OAUTH2的refresh-token
# cas.ticket.tgt.onlyTrackMostRecentSession=true
# cas.ticket.tgt.maxLength=50
默认配置
# Set to a negative value to never expire tickets 负值就是永不过期
# cas.ticket.tgt.maxTimeToLiveInSeconds=28800
# cas.ticket.tgt.timeToKillInSeconds=7200
remember me配置
# cas.ticket.tgt.rememberMe.enabled=true
# cas.ticket.tgt.rememberMe.timeToKillInSeconds=28800
timeout: most-recently-used 清理最近最多使用的过期策略 类型WEB应用SESSION过期策略
# cas.ticket.tgt.timeout.maxTimeToLiveInSeconds=28800
throttled timeout
扩展了timeout过期策略, 此种策略有一个throttling的概念,在此窗口,一个ticket最多每N秒使用一次。主要用来现在某些客户端配置错误,导致大量的请求
# cas.ticket.tgt.throttledTimeout.timeToKillInSeconds=28800
# cas.ticket.tgt.throttledTimeout.timeInBetweenUsesInSeconds=5
hard timeout
创建后一段时间后必须过期
# cas.ticket.tgt.hardTimeout.timeToKillInSeconds=28800
Service Ticket 策略
这种过期测试,设置一个时间范围,在此范围内一个授权的用户可以使用ST
TICKET 访问过N次后过期。或者空闲N秒后过期
# cas.ticket.st.maxLength=20
# cas.ticket.st.numberOfUses=1
# cas.ticket.st.timeToKillInSeconds=10
proxy ticket 策略
看起来和service ticket过期策略一样,也行实现不一样。。。
cas.ticket.pt.timeToKillInSeconds=10
# cas.ticket.pt.numberOfUses=1
Proxy-granting ticket策略
# cas.ticket.pgt.maxLength=50
在有效期内。 可以通过一个有效的PGT 来获取一个PT, 过期策略同ticket-granting ticket一致
TicketRegistry
部署环境与技术经验通常决定了如何选择ticket存储组件
基于缓存的实现比较适合HA部署方式
基于内存(in_memory)的只能适合小应用系统
可以存储在数据库、缓存。具体实现包括:JMS hazelcast JPA ehcache memcached JPA redis mongodb等。
下文只接受将令牌存储在redis,基于MAVEN资源库
1,引入
存到REDIS的KEY,以CAS_TICKE:开头
配置:
cas.ticket.registry.redis.host=localhost
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6380
cas.ticket.registry.redis.password=
cas.ticket.registry.redis.timeout=2000
cas.ticket.registry.redis.useSsl=false
cas.ticket.registry.redis.usePool=true
cas.ticket.registry.redis.pool.max-active=20
cas.ticket.registry.redis.pool.maxIdle=8
cas.ticket.registry.redis.pool.minIdle=0
cas.ticket.registry.redis.pool.maxActive=8
cas.ticket.registry.redis.pool.maxWait=-1
cas.ticket.registry.redis.pool.numTestsPerEvictionRun=0
cas.ticket.registry.redis.pool.softMinEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.minEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.lifo=true
cas.ticket.registry.redis.pool.fairness=false
cas.ticket.registry.redis.pool.testOnCreate=false
cas.ticket.registry.redis.pool.testOnBorrow=false
cas.ticket.registry.redis.pool.testOnReturn=false
cas.ticket.registry.redis.pool.testWhileIdle=false
cas.ticket.registry.redis.sentinel.master=mymaster
cas.ticket.registry.redis.sentinel.node[0]=localhost:26377
cas.ticket.registry.redis.sentinel.node[1]=localhost:26378
cas.ticket.registry.redis.sentinel.node[2]=localhost:26379
对ticket的签名加密设置:
configurationKey 的值是cas.ticket.registry.redis. 实际使用时没做签名加密.令牌本身也没业务状态,&签名后太长
# ${configurationKey}.crypto.signing.key=
# ${configurationKey}.crypto.signing.keySize=
# ${configurationKey}.crypto.encryption.key=
# ${configurationKey}.crypto.encryption.keySize=
ticket过期就是存reids时的过期时间 time
# ${configurationKey}.crypto.alg=AES
# ${configurationKey}.crypto.enabled=false