CAS 5.3.X ticket存储与过期

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,引入


    org.apereo.cas
    cas-server-support-redis-ticket-registry
    ${cas.version}

存到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

 

你可能感兴趣的:(技术)