作者:青竹风163_955 | 来源:互联网 | 2023-09-08 16:56
前言:由于项目需要配置负载均衡集群等,而cas的登录session及票据ticket等是保存在内存的,集群后分别在两个tomcat服务器上,所以会出现登录一个客户端之后,访问另一个客户端,此时可能请求的是另一个cas服务器的tomcat,这一个尚未登录,因此获取不到登录的信息,仍然会跳转登录页,单点登录失效。
通过查阅资料,发现处理这种情况,需要两个步骤,分别是:
(1)session共享 :session的存取都从中央缓存redis中存取
(2)票证共享 :采用统一的ticket存取策略,所有ticket的操作都从中央缓存redis中存取。
因此,改造cas服务器项目为使用redis保存session和session,集群的所有cas服务器都配置同一个redis,也就是使用相同的session及ticket,这个处理方式,可以避免登录后有时还要登录的情况。
1、导入保存、读取redis所需的maven包,分别是session的和ticket的:
org.apereo.cascas-server-webapp-session-redis${cas.version}org.apereo.cascas-server-support-redis-ticket-registry${cas.version}
2.配置redis存储session,application.properties中添加:
#配置redis存储session
cas.webflow.autoconfigure=true
cas.webflow.alwaysPauseRedirect=false
cas.webflow.refresh=true
cas.webflow.redirectSameState=falsecas.webflow.session.lockTimeout=30
cas.webflow.session.compress=false
cas.webflow.session.maxConversations=5
cas.webflow.session.storage=true
spring.session.store-type=redis
spring.redis.host=192.168.4.155
spring.redis.password=
spring.redis.port=6379
3.配置redis存储ticket,application.properties中添加:
#配置redis存储ticket
cas.ticket.registry.redis.host=192.168.4.155
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6379
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
4.保存redis的key值的设置:
# cas.tgc.path=
# cas.tgc.maxAge=-1
# cas.tgc.domain=
# cas.tgc.name=TGC
# cas.tgc.secure=true
# cas.tgc.httpOnly=true
# cas.tgc.rememberMeMaxAge=1209600
# cas.tgc.crypto.encryption.key=
# cas.tgc.crypto.signing.key=
cas.tgc.crypto.enabled=false
cas每次启动的时候回随机生成两个key的值,这样集群部署的时候就会出现这两个值不一样,这时候修改cas.tgc.crypto.enabled=false即可。
5.分别把cas服务器打包部署到两个不同的tomcat,通过nginx进行负载均衡配置,配置如下:
upstream upstream_name{ip_hash;server 192.168.4.120:8081;server 192.168.4.120:8080;}server {listen 80;server_name localhost;location / {proxy_pass http://upstream_name;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
6.启动nginx
#cd /usr/local/nginx/sbin/
#./nginx
7.访问192.168.4.120/cas,通过其中一个客户端登录后可以看到请求进入其中一个cas部署的tomcat,且在redis保存了session和ticket。当停掉当前进入的这个tomcat时,访问另一个客户端,仍然不需要登录。至此,cas服务器集群成功。
8.springboot客户端集群:
这个比较简单,只需要修改项目配置的cas服务器地址为反向代理的地址及客户端地址为反向代理出去的地址即可。
例如,nginx的配置如下:(ip_hash是不能缺少的,这个设置是使一个用户的访问进入的是同一台服务器,避免重复重定向的问题)
upstream upstream_name{ip_hash;server 192.168.4.120:8081;server 192.168.4.120:8080;}upstream upstream_name1{ip_hash;server 192.168.4.120:8082;server 192.168.4.120:8083;}server {listen 80;server_name localhost;location / {proxy_pass http://upstream_name;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}location /dognet {proxy_pass http://upstream_name1;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
我们需要把yml配置文件里面的casServer地址及projectUrl修改为下面这样即可:
#cas配置
cas:client-name: ywjk#测试工作机地址server:url: http://192.168.4.120/cas#本机ip地址project:url: http://192.168.4.120/dognet/
9.测试访问客户端时,跳转正常、单点登录正常、单点退出正常。至此,cas服务器及客户端搭建完毕