什么是單點(diǎn)登錄
單點(diǎn)登錄(Single Sign On)觉吭,簡(jiǎn)稱為 SSO,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一仆邓。SSO的定義是在多個(gè)應(yīng)用系統(tǒng)中鲜滩,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。
SSO是概念节值,實(shí)現(xiàn)SSO需要用到CAS框架
使用cas框架實(shí)現(xiàn)單點(diǎn)登陸
有多個(gè)不同服務(wù)器的web層需要登陸徙硅。就要使用cas。在一個(gè)web層頁(yè)面登錄搞疗,其他頁(yè)面都不需要登錄就能訪問
如www.taobao.com car.taobao.com嗓蘑。 只需要在登陸中心(cas服務(wù)端)登錄一次就能訪問全部不同服務(wù)器的頁(yè)面
CAS
是開源的企業(yè)級(jí)單點(diǎn)登陸解決方案
CAS Server是獨(dú)立部署的web應(yīng)用,下載下來用包war復(fù)制到tomcat啟動(dòng)匿乃,CAS項(xiàng)目中配置文件設(shè)置了tomcat的端口是8080桩皿。自行修改,默認(rèn)是Https協(xié)議幢炸,開發(fā)時(shí)要關(guān)閉Https認(rèn)證協(xié)議
CAS Client(自己的web項(xiàng)目)支持非常多的客戶端(這里指單點(diǎn)登錄系統(tǒng)中的各個(gè)Web應(yīng)用)泄隔,包括Java,PHP等
CAS包含兩個(gè)部分:CAS Server和CAS Client,
CAS Server需要獨(dú)立部署宛徊,主要負(fù)責(zé)對(duì)用戶的認(rèn)證工作;
CAS Client負(fù)責(zé)處理對(duì)客戶端受保護(hù)資源的訪問請(qǐng)求佛嬉,需要登陸時(shí)逻澳,重定向到CAS Server
SSO單點(diǎn)登錄訪問流程:
1.訪問服務(wù):SSO客戶端發(fā)送請(qǐng)求訪問應(yīng)用系統(tǒng)提供的服務(wù)資源
2.定向認(rèn)證:SSO客戶端會(huì)重定向用戶請(qǐng)求到SSO服務(wù)器
3.用戶認(rèn)證:用戶身份認(rèn)證
4.發(fā)放票據(jù):SSO服務(wù)器會(huì)產(chǎn)生一個(gè)隨機(jī)的Service Ticket
5.驗(yàn)證票據(jù):SSO服務(wù)器驗(yàn)證票據(jù)Service Ticket的合法性,驗(yàn)證通過后暖呕,允許客戶端訪問服務(wù)
6.傳輸用戶信息:SSO服務(wù)器驗(yàn)證票據(jù)通過后斜做,傳輸用戶認(rèn)證結(jié)果信息給客戶端
搭建CSA服務(wù)器
Cas服務(wù)端其實(shí)就是一個(gè)war包,
到官方下載https://www.apereo.org/projects/cas/download-cas缰揪,這里下載的是war包陨享,但是是2016年的4.x版本,
上面網(wǎng)址給需要直接下載war的人用
我們想找較新的版本钝腺,但是新版本已經(jīng)不提供war抛姑,需要自己來打成war包,這里下載5.x的新版本
https://github.com/apereo/cas-overlay-template下載5.3分支
解壓后進(jìn)行目錄艳狐,build一下項(xiàng)目 ,過程有點(diǎn)慢定硝,耐心等待
多了一個(gè)target文件夾
點(diǎn)入文件夾
把cas.war放到tomcat的webapp中,啟動(dòng)tomcat
訪問http://localhost:8080/cas
啟動(dòng)成功
默認(rèn)用戶名和密碼cas\WEB-INF\classes\application.properties
用戶名:casuser 密碼:Mellon
CAS服務(wù)端啟動(dòng)成功
去除https認(rèn)證
CAS默認(rèn)使用的是HTTPS協(xié)議毫目,如果使用HTTPS協(xié)議需要SSL安全證書(需向特定的機(jī)構(gòu)申請(qǐng)和購(gòu)買) 蔬啡。如果對(duì)安全要求不高或是在開發(fā)測(cè)試階段,可使用HTTP協(xié)議镀虐。我們這里講解通過修改配置箱蟆,讓CAS使用HTTP協(xié)議。
如果不去除https認(rèn)證下面整合客戶端時(shí)會(huì)出現(xiàn)未認(rèn)證授權(quán)的服務(wù)
修改CAS服務(wù)端配置文件
cas\WEB-INF\classes目錄的application,properties添加如下的內(nèi)容
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
cas\WEB-INF\classes\services目錄下的HTTPSandIMAPS-10000001.json
修改內(nèi)容如下,即添加http
"serviceId" : "^(https|http|imaps)://.*",
CAS客戶端配置(就是自己項(xiàng)目)
pom.xml依賴
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.1.0-GA</version>
</dependency>
application.properties配置文件
客戶端1
server.port=8088
#cas服務(wù)端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服務(wù)端的登錄地址
cas.server-login-url=http://localhost:8080/cas/login
#當(dāng)前服務(wù)器的地址(客戶端)
cas.client-host-url=http://localhost:8088
#Ticket校驗(yàn)器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3
每個(gè)客戶端只要修改當(dāng)前服務(wù)器地址就行了
如客戶端2
server.port=8090
#cas服務(wù)端的地址
cas.server-url-prefix=http://localhost:8080/cas
#cas服務(wù)端的登錄地址
cas.server-login-url=http://localhost:8080/cas/login
#當(dāng)前服務(wù)器的地址(客戶端)
cas.client-host-url=http://localhost:8090
#Ticket校驗(yàn)器使用Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3
配置完成
沒有登陸時(shí)http://localhost:8088和http://localhost:8090訪問都會(huì)跳到CAS 登陸頁(yè)
只要客戶端1登陸了刮便,登陸端2就能直接訪問空猜,反之也能訪問
上面是通過CAS默認(rèn)的用戶名和密碼進(jìn)行登錄的,實(shí)際項(xiàng)目中我們的用戶名和密碼肯定是從數(shù)據(jù)庫(kù)中獲取到的
官方文檔https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html
接下來我們就看一下怎么通過獲取數(shù)據(jù)庫(kù)的用戶進(jìn)行驗(yàn)證
配置CAS服務(wù)端
G:\google下載\cas-overlay-template-5.3的pox.xml來打開項(xiàng)目
pom.xml文件加上依賴
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
cmd進(jìn)入命令 mvn clean package命令的時(shí)候會(huì)重新生成一個(gè)war包
把war放到tomcat中解壓
cas\WEB-INF\classes目錄的application.properties
首先注釋掉默認(rèn)的用戶#cas.authn.accept.users=casuser::Mellon
添加如下的內(nèi)容
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&useSSL=true
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=a1234567
cas.authn.jdbc.query[0].sql=select * from user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
需要加上之前去掉https的配置
**注意 mysql6.0以上版本配置有些不同 參考
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&useSSL=true&autoReconnect=true&failOverReadOnly=false&autoReconnect=true&serverTimezone=UTC
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=a1234567
cas.authn.jdbc.query[0].sql=select * from user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver