目錄
- Cas-Server搭建
-
-
- 大浪淘沙,沉者為金
- 弱水三千,隻取一瓢
-
- 服務端配置介紹
-
-
- 最常用的三個配置檔案
- 最常用的三個JSP頁面
-
- 自定義資料源
- 關閉HTTPS協定
- 開啟Restful接口
-
-
- 1、加入jar包。
- 2、配置web.xml
- 3、測試Ticket機制。
-
- 使用HTTPS協定
-
-
- 治标
- 治本
-
Cas-Server搭建
大浪淘沙,沉者為金
Cas-Server官網:
https://github.com/apereo/cas
進入官網,可以看到版本有很多,主要差別為:
3.x:web版本
4.x:maven版本
5.x:gradle版本
一般4.x用的比較多。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPRpVaKdlYxUjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwkTNzAjNxETMxETMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
高版本:
自己打包的話,指令為:
build.cmd run
mvn clean package
build package
弱水三千,隻取一瓢
下載下傳好後,打開發現檔案非常多。
都不要去看,直接找到module目錄下的cas-server-webapp-4.0.0.war。
将war包放到一個幹淨的Tomcat中(以後出錯,可以排除tomcat本身問題報錯)。
Tomcat官網:
https://tomcat.apache.org/
服務端配置介紹
最常用的三個配置檔案
deployerConfigContext.xml
1、檔案裡有内置使用者casuser/Mellon,搜尋Bean:primaryAuthenticationHandler,即可找到。不使用自己的資料庫,直接登入。
2、自定義資料源。
3、關閉https協定。
cas.properties
1、ticket命名。
2、資料源。
web.xml
1、開啟restful接口。
·························································································
最常用的三個JSP頁面
最常修改的三個JSP頁面,登入界面,登入成功界面,退出界面。
說的牛逼一點,就是自定義認證界面,自定義登出界面。
casLoginView.jsp
路徑:cas\WEB-INF\view\jsp\default\ui\casLoginView.jsp
Cas認證登入界面。修改登入界面就是修改這個檔案。
casGenericSuccess.jsp
路徑:\cas\WEB-INF\view\jsp\default\ui\casGenericSuccess.jsp
路徑根據版本不同,是不一樣的,但是檔案名稱是一樣的。
使用者認證通過進入的頁面。
casLogoutView.jsp
路徑:\cas\WEB-INF\view\jsp\default\ui\casLogoutView.jsp
退出Cas-Server時,進入的頁面。
自定義資料源
1、修改Bean,primaryAuthenticationHandler。
原先這個是内置使用者,将它替換為下邊。
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="select pwd_ from os_user where USER_NO_ = ?" />
<property name="passwordEncoder" ref="passwordEncoder"></property>
</bean>
2、增加Bean,passwordEncoder與dataSource。
<!--配置加密器,如果使用者表的密碼是使用MD5加密的,就加上這個。
如果使用了其他的加密手段,也可以自定義加密器類,然後注入即可。-->
<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/realry?characterEncoding=utf8"
p:user="root"
p:password="root"/>
3、加入jar包。
關閉HTTPS協定
看下邊四個連結,都是https開頭的。
https://blog.csdn.net/
https://account.aliyun.com/
https://www.jd.com/
https://www.taobao.com/
厲害一點的網站都是https,注重保密。
我們不厲害,是以我們關掉它,不使用HTTPS協定。
1、deployerConfigContext.xml檔案,修改為false。
<bean id="proxyAuthenticationHandler"
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />
2、deployerConfigContext.xml檔案,p:serviceId增加http(不加不會報錯,6.x版本要求加上)。
<bean class="org.jasig.cas.services.RegexRegisteredService"
p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"
p:serviceId="^(https?|imaps?|http?)://.*" p:evaluationOrder="10000001" />
3、ticketGrantingTicketCookieGenerator.xml檔案,修改為false。
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
4、warnCookieGenerator.xml檔案,修改為false。
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
開啟Restful接口
Cas認證支援很多種協定去認證,比如OAuth、SAML1、SAML2等協定,最常用的為REST協定擷取TGT,TGT産生ST,通過ST與TGC去通路服務端驗證。是以我們要給cas-server開啟restful接口。
1、加入jar包。
看你是什麼項目。
maven項目引入依賴:
<dependency>
<groupId>org.jasig.cas</groupId>
<artifactId>cas-server-integration-restlet</artifactId>
<version>4.0.0</version>
</dependency>
web項目找jar包的方法:
https://blog.csdn.net/numbbe/article/details/112197426
2、配置web.xml
<servlet>
<servlet-name>restlet</servlet-name>
<servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>restlet</servlet-name>
<url-pattern>/v1/*</url-pattern>
</servlet-mapping>
不加入這段配置,通路會報404錯誤。
3、測試Ticket機制。
直接使用浏覽器通路:http://localhost:8080/cas/v1/tickets。
出現Method Not Allowed,你就成功的開啟了Restful接口。
相反,如果你一直顯示認證界面或者登陸成功界面,你就是沒有開啟,前兩步操作有誤。
具體情況可以參考:
https://blog.csdn.net/numbbe/article/details/112213089
另外Ticket機制,參考這篇文章:
https://blog.csdn.net/numbbe/article/details/112150306
1、擷取TGT。
http://localhost:8080/cas/v1/tickets POST
username=admin&password=1
響應碼 201
傳回值 TGT
2、擷取ST。
http://localhost:8080/cas/v1/tickets/{上一步驟的TGTID} POST
service=localhost:8020 目标用戶端位址
響應碼 200
傳回值 ST
3、驗證ST。
http://localhost:8080/cas/serviceValidate POST
service=localhost:8020 ticket=ST-1-5CAuRHk7XLiPwKRAeZAx-xiaolaoben
響應碼 200
傳回值 username
使用HTTPS協定
當我們正常通路cas-server時,經常看到一個警告。
翻譯一下就是:讓你使用HTTPS協定進行單點登入。
治标
對于某些強迫症患者來說,不喜歡warning,可以用一個非常簡單的方法。
進入casLoginView.jsp頁面,将這段話删掉就好了,不用管什麼HTTPS協定。
當然,這是治标不治本。
治本
既然Cas讓我們使用HTTPS,那我們使用HTTPS好了。
首先,知道兩個問題。
1、HTTP與HTTPS的差別
我們自己在本地啟動的服務,比如tomcat,kibana,rabbitmq全部都是http協定。
HTTPS證書需要花錢買,有免費的,但是免費的HTTPS證書有以下三個缺點:
1、相容浏覽器較少,且安全性較低,形同虛設。
2、隻能保護一個域名,不支援通配符域名、多域名等。
3、有效期很短,需要你重複申請。
HTTPS=HTTP+SSL
SSL是用于對HTTP傳輸的資料進行加密的協定。
HTTP傳輸的資料都是未加密的,HTTPS傳輸的資料都是加密的。
2、為什麼使用域名
在做單點登入的過程中,經常讓你使用域名進行回調用戶端位址。
1、cas-server是部署在獨立伺服器上的,你在用戶端伺服器寫一個localhost,cas-server回調下級系統時,這個localhost相對于cas-server就是單點登入伺服器本機,而不是用戶端的localhost。
2、為什麼鋼筆叫鋼筆,鉛筆叫鉛筆,為什麼使用域名,規定讓你用,你就用,牽一發而動全身。
3、安全證書是與域名綁定的,你寫ip位址,證書不認識,會報No subject alternative names present錯誤。
證書是單點登入認證系統中很重要的一把鑰匙,證書能極大的提高用戶端與伺服器的互動安全。在這裡使用keytool工具生成證書,JDK自帶工具。
keytool工具說明:
http://www.micmiu.com/lang/java/keytool-start-guide/
1、修改本地域名,進入C:\Windows\System32\drivers\etc,修改hosts檔案。
127.0.0.1 cas.server.com
127.0.0.1 cas.client1.com
127.0.0.1 cas.client2.com
2、服務端證書,進入你的cas-server的Tomcat目錄中,cmd依次執行指令。
最終會生成三個檔案,如圖:
1、生成伺服器的密匙檔案(casserver.keystore)
keytool -genkey -alias casserver -keypass cas123 -keyalg RSA -keystore casserver.keystore -validity 365
-alias指定别名為casserver;
-keyalg指定RSA算法;
-keypass指定私鑰密碼;
-keystore指定密鑰檔案名稱為casserver.keystore;
-validity指定有效期為365天。
2.生成服務端證書(casserver.cer)
keytool -export -alias casserver -storepass cas123 -file casserver.cer -keystore casserver.keystore
-alias指定别名為casserver;
-storepass指定私鑰密碼;
-file指定導出證書的檔案名為casserver.cer;
-keystore指定之前生成的密鑰檔案的檔案名。
3、伺服器的證書casserver.cer導入到cacerts密鑰庫檔案中(cacerts檔案)
keytool -import -trustcacerts -alias casserver -storepass cas123 -file casserver.cer –keystore cacerts
3、用戶端證書,進入你的環境變量的JDK目錄jdk/jre/lib/security目錄(cacerts檔案)
keytool -import -trustcacerts -alias casclient -storepass changeit -file C:\Users\admin\Desktop\apache-tomcat-8.5.61\casserver.cer -keystore cacerts
4、配置cas-server的server.xml檔案,把之前的8080端口删掉,加上下邊這段,開啟HTTPS通路。
其中keystoreFile為你的證書位址,keystorePass你的證書密碼。
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\Users\admin\Desktop\apache-tomcat-8.5.61\casserver.keystore"
keystorePass="cas123">
</Connector>
5、配置cas-server,打開HTTPS協定,上邊有關閉HTTPS協定的步驟,這邊就反着來就行了。
之後通過https協定通路,就可以看到沒有了warning,不會再說不安全了。
Tips:
有時候,你會碰到這樣的情況,總是報不安全之類的,點選進階然後點進去就行了。
取消方法為:
1、将你上邊生成的安全證書導入你使用的谷歌浏覽器或者EDGE浏覽器就可以了。
2、你的安全證書除了用于導入,還可以直接輕按兩下安裝。