前言:由於項目需要配置負載均衡集羣等,而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的:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp-session-redis</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-redis-ticket-registry</artifactId>
<version>${cas.version}</version>
</dependency>
2.配置redis存儲session,application.properties中添加:
#配置redis存儲session
cas.webflow.autoconfigure=true
cas.webflow.alwaysPauseRedirect=false
cas.webflow.refresh=true
cas.webflow.redirectSameState=false
cas.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服務器及客戶端搭建完畢