CAS 是Yale(耶魯)大學的一個開源的企業級單點登錄系統,它的特點:
java (SPRing Webflow/Spring Boot) 服務組件可插拔身份驗證支持(LDAP,Database,X.509,MFA)支持多種協議(CAS,SAML,OAuth,OpenID,OIDC)跨平臺客戶端支持(Java,.Net,php,Perl,Apache等)與uPortal,Liferay,BlueSocket,Moodle,Google Apps等集成CAS提供了一個友好的開源社區,方便開發者積極支持和貢獻項目。
單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
當用戶第一次訪問應用系統A的時候,因為還沒有登錄會被引導到認證系統中進行登錄;根據用戶提供的登錄信息,認證系統進行身份校驗,如果通過校驗,應該返回給用戶一個認證的憑據(ticket);用戶再訪問別的應用的時候,就會將這個ticket帶上,作為自己認證的憑據,應用系統接受到請求之后會把ticket送到認證系統進行校驗,檢查ticket的合法性。如果通過校驗,用戶就可以在不用再次登錄的情況下訪問應用系統B和應用系統C了。
OAuth是一個關于授權(authorization)的開放網絡標準,在全世界得到廣泛應用,目前的版本是2.0版。
OAuth在“客戶端”與“服務提供商”之間設置了一個授權層(authorization layer)?!翱蛻舳恕辈荒苤苯拥卿洝胺仗峁┥獭保荒艿卿浭跈鄬?,以此將用戶與客戶端區分開來?!翱蛻舳恕钡卿浭跈鄬铀玫牧钆疲╰oken),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的權限范圍和有效期。
“客戶端”登錄授權層以后,“服務提供商”根據令牌的權限范圍和有效期,向“客戶端”開放用戶儲存的資料。
通過上面的概述大家可以很清楚的想明白兩者的適用場景,以面向的用戶不同可以做個劃分,sso服務對象是各個應用系統,oauth服務對象是用戶。

CAS系統架構包括CAS Server和CAS Clients,它們是通過各種協議進行通信的兩個物理組件。
CAS Server是基于Spring框架構建的Java Servlet,其主要職責是通過發出和驗證票證來驗證用戶并授予對使用CAS的服務(通常稱為CAS客戶端)的訪問權限。當用戶在服務器上登錄時向會向用戶發出票證(TGT)并創建SSO會話。通過使用TGT令牌進行瀏覽器重定向,根據用戶的請求向服務發出服務票證(ST)。隨后通過反向通道通信在CAS服務器上驗證ST。這些業務流程在CAS協議文檔中非常詳細地描述。
“CAS Client”在具體使用中有兩個不同的含義,CAS Client是可以通過所支持的協議與服務器通信的任何啟用CAS的應用程序,CAS Client還可以是可以與各種軟件平臺和應用集成以便經由某種認證協議(例如,CAS,SAML,OAuth)與CAS Server通信的軟件包。客戶端支持多種軟件平臺和應用的CAS客戶端已經開發。
平臺 Apache httpd Server (mod_auth_cas module)Java (Java CAS Client).NET (.NET CAS Client)PHP (phpCAS)Perl (PerlCAS)Python (pycas)Ruby (rubycas-client)應用 Outlook Web application (ClearPass + .NET CAS Client)Atlassian ConfluenceAtlassian JIRADrupalLiferayuPortal客戶端通過幾種支持的協議與服務器通信。所有支持的協議在概念上類似,但不同的協議對應于特定的應用場景。例如,CAS協議支持委托(代理)認證,SAML協議支持屬性釋放和單點退出。
支持的協議 CAS (versions 1, 2, and 3)SAML 1.1 and 2OpenID ConnectOpenIDOAuth 2.0為了給大家更為直觀的感受,官方有提供一個示例,可以訪問https://jasigcas.herokuapp.com/cas 來體驗一下。
要想讓CAS服務跑起來,具體的安裝方式有很多,在這里只是演示我的方式,給大家一個參考。
關于上面組件的安裝過程就不在這里展開,大家安裝有疑問可以先到網上搜索,也可以加群與我聯系。
你可以直接從github上下載這個項目 https://github.com/apereo/cas-gradle-overlay-template,也可以直接訪問下載鏈接 https://github.com/apereo/cas-gradle-overlay-template/archive/master.zip。
有人可能好奇為什么要下載這個項目?原因在于我們要覆蓋官方安裝包中默認的屬性,這也是官方提供的一個示例項目。
這個項目體積非常小,因為它依賴的jar包需要下載,這也就是為什么我要安裝Maven的原因,但又由于這個項目包是由gradle來構建的,所以還需要安裝Gradle。
接下來大家跟著我的命令執行,應該會有相同的結果。
進入項目根目錄,后續的命令除特別說明外都將在這個目錄下執行。
cd cas-gradle-overlay-template在執行構建命令時會從遠程地址下載 gradle-3.3-bin.zip 壓縮包(下載速度慢,并且中斷之后不會增量下載),所以我建議你通過旋風之類的軟件把這個文件下載并放到下面的目錄里面。
如果你像我上面說的那樣做,那還別忘記要修改 gradle-wrapper.properties 文件,把原來的遠程地址替換成相對地址即可。
另外我建議你在maven中設置遠程倉庫地址為國內的源,因為這樣下載速度會非常快,國外的倉庫下載jar包太慢。國內的源里面推薦使用阿里的源,下面粘貼一段示例代碼。
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf></mirror>現在執行命令開始下載項目所需要的依賴包,并構建一個新的war包,我們會部署這個包以啟動CAS服務。
./gradlew clean build確保你在項目要目錄下執行上面的命令,如果成功你會看到和我類似的結果
Copying configuration to /etc/cas/config:cas:clean:cas:compileJava UP-TO-DATE:cas:processResources UP-TO-DATE:cas:classes UP-TO-DATE:cas:findMainClass:cas:copyConfig:cas:war:cas:bootRepackage SKIPPED:cas:assemble:cas:compileTestJava UP-TO-DATE:cas:processTestResources UP-TO-DATE:cas:testClasses UP-TO-DATE:cas:test UP-TO-DATE:cas:check UP-TO-DATE:cas:buildBUILD SUCCESSFUL實際的結果可能和我不相同,因為我并非首次執行上面的命令,項目所依賴的包已經下載完了,所以你執行命令的時間可能比我要長。
上面的命令主要是為了讓你下載項目的依賴jar包,雖然實際上我們的war包已經生成,但還沒有配置一些參數以覆蓋官方包中的默認參數,所以現在還得修改配置文件。具體介紹請繼續往下看。
由于CAS服務全程使用HTTPS加密通訊協議,所以必須配置證書以達到此目的,否則服務將不會正常服務。
不管你是從證書管理網站上申請的證書,還是像下面示例的這樣,是自己生成的未簽名證書,都可以按照下面的方法進行證書的配置。
第一步:生成key
openssl genrsa -des3 -out cas.example.com.key第二步:根據上一步的key生成crt證書
openssl req -new -x509 -key cas.example.com.key -out cas.example.com.crt第三步:根據前面兩步的文件生成PKCS12證書
openssl pkcs12 -export -in cas.example.com.crt -inkey cas.example.com.key -out cas.example.com.p12 -name cas第四步:把P12證書導入java的密鑰存儲庫文件中
keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore keystore -srckeystore cas.example.com.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias cas最后一步操作之后會在當前目錄生成一個文件 keystore,你需要將這個文件復制到項目的配置文件目錄下面。
修改文件之后的內容示例
cas.server.name: https://cas.example.com:8443cas.server.prefix: https://cas.example.com:8443/cascas.adminPagesSecurity.ip=127/.0/.0/.1logging.config: file:/etc/cas/config/log4j2.xml# Embedded Tomcatserver.ssl.keyStore: file:/etc/cas/config/keystoreserver.ssl.keyStorePassWord=123456server.ssl.keyPassword=123456# Accept Users Authenticationcas.authn.accept.users=# Ticket Granting Cookiecas.tgc.signingKey=Ci1kE5-PyQfD0i_a3sH16B32QhwGBbHXOmhR4r36vv0cB0RasLdEb7AI0ykouyMrE5RBbIAxqXvipmQEUA6juQcas.tgc.encryptionKey=Zv0LARlN7g7LxI6wmp6T4sLr2-TiZZ3K5W8pRIWcvO0# Spring Webflowcas.webflow.signing.key=16ua53AWy3PM4rYj6V0rBab_U-X7HvnFpDAVaXMEwwdhiZzTHM5vlYpLzm8HR6jf4DcDbM1_HQxCu6kQGjAOqgcas.webflow.encryption.key=NamwVAyVrXeyrKvs盡量按照上面的示例配置來修改,以免你掉進未知的“坑”里面。由于修改了配置文件,需要重新執行上面的命令以構建項目。
由于項目中使用了Spring boot,按照官方文檔的描述是可以按照以下的命令進行啟動的,但我在操作時每次都構建到80%左右終端上的命令就停止了。所以我選擇直接將war包部署到tomcat中。
如果你使用Spring boot則使用下面的命令:
./gradlew bootRun如果你使用tomcat則按照如下步驟操作:
假設你安裝了tomcat把war包部署到webapps目錄中cp cas/build/libs/cas.war /opt/tomcat/webapps/啟動tomcat /opt/tomcat/bin/startup.sh查詢日志輸出18-Feb-2017 17:19:32.000 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]18-Feb-2017 17:19:32.026 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read18-Feb-2017 17:19:32.029 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-jsse-nio-8443"]18-Feb-2017 17:19:32.411 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read18-Feb-2017 17:19:32.412 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]配置本地hosts讓 cas.example.com 域名指向本地IP 127.0.0.1,打開瀏覽器訪問 https://cas.example.com:8443/cas 可以看到下面的頁面。

寫到這里關于CAS的安裝就結束了,至于將CAS與具體的業務系統結合,那是屬于下節文章的內容,請關照我后續關于CAS的系列文章。
新聞熱點
疑難解答