蔡建軍 魏金津 任女爾



摘要:建設車企的單點登錄系統,可以提升其用戶體驗,提高其使用軟件的效率。為了滿足車企定制化的軟件業務需求而基于CAS二次開發單點登錄系統。使用Apache Shiro框架去整合CAS客戶端開發,可以大大提高開發效率和系統可靠性。對于企業不同的系統需要根據其具體架構使用不同的方法去集成CAS客戶端。
關鍵詞:CAS;單點登錄;Shiro
中圖分類號:TP319? ? ? ? 文獻標識碼:A
文章編號:1009-3044(2019)28-0251-05
開放科學(資源服務)標識碼(OSID):
1概述
隨著車企業務的快速發展,內部系統不斷增多,每個系統都有自己的認證體系,用戶需要記住每個系統的用戶名和密碼并在訪問時輸入校驗,這樣是非常麻煩的,所以用戶希望只需要登錄一次就可以訪問所有指定的被信任的應用系統。
某車企的需求是將A、B、C三套系統進行單點登錄整合,要求其中一個系統登錄之后便可通過菜單鏈接到別的系統。A與C系統的登錄用戶用的是同一數據庫的同一用戶表,B系統的登錄用戶雖然和A、C不同,但是可以經由一定的關系映射過去。A、B系統所用框架是基于傳統XML Spring的,而C系統是基于新的SpringBoot【1】框架開發的。
針對此車企的單點登錄需求我們選擇了CAS去開發實現。CAS全稱為Central Authentication Service,中文意思是中央認證服務,是一個實現單點登錄的開源框架,分為客戶端與服務端兩部分。
CAS服務端用來負責用戶的認證工作,會提供一個統一的登錄頁面,用戶輸入登錄名、密碼登錄后CAS會生成一個ticket存在服務器,還會生成一個類似cookie的票據返回客戶端,用戶下次訪問帶上票據經過CAS驗證后便可以訪問系統。
系統集成CAS客戶端,便可以接入CAS服務。當用戶訪問車企集成完CAS客戶端的系統時,系統先判斷是不是登錄,沒有登錄則重定向到CAS服務端的統一登錄頁面,用戶再通過登錄名、密碼登錄。
由于CAS服務端無法滿足車企業務的需求,我們還需要對其進行二次開發。三個系統之前的登錄功能都要廢棄,登錄統一到一個系統。選用Apache Shiro【2】為安全框架去整合使用CAS,可以大大提高集成的效率與可靠性。
2 CAS介紹
1)術語
Ticket Granting ticket (TGT):可以認為是CAS Server根據用戶名密碼生成的一張票,存在Server端。
Ticket-granting cookie (TGC):其實就是一個Cookie,存放用戶身份信息,由Server發給Client端。
Service ticket (ST):由TGT生成的用于驗證并且只能用一次的票據。相當于CAS服務端發給客戶端的票,下次CAS客戶端帶著票找服務端校驗。
2)處理流程
1、用戶訪問系統,若是沒有登錄,就重定向到CAS服務端的登錄頁面,URL形如http ://cas-ip:port/login?service=http ://ip:port,service后面的地址就是登錄成功后要重定向的系統URL。
2、在登陸頁面輸入用戶名密碼認證,認證成功后CAS服務端生成TGT,再用TGT生成一個ST。然后再第三次重定向并返回ST和cookie(TGC)到瀏覽器。
3、瀏覽器帶著ST再訪問想要訪問的地址http://ip:port /?ticket=ST-36828-xpvUKEdxVfeiPM0Sauz8,ticket后面那一串便是ST。
4、瀏覽器的服務器收到ST后再去CAS服務器驗證一下是不是為本身簽發的,驗證經由過程后就會表現頁面信息,也便是重定向到第1步service后面的那個URL,首次登陸完畢。
5、再登陸另一個接入CAS服務端的客戶端體系,重定向到CAS服務端,Server判定是第一次來(可是此時有TGC,也便是cookie,所以不用去登錄頁面了),但此時沒有ST,去cas-server申請一個于是重定向到cas-server,形如:http://cas-ip:port /login?service=http://ip:port&&TGC(cookie)。
6、CAS服務端生成ST,重定向到瀏覽器http ://ip:port/?ticket=ST-31868-uiopasdcftqsxzmklgv6-yyyy。
7、瀏覽器的服務器收到ST后再去cas-server驗證一下是否為自己簽發的,驗證通過后就會顯示頁面信息(同第4步)。
3 CAS服務端二次開發
我們選擇使用Apache的CAS Server為單點登錄服務器,但是其功能遠遠不能滿足我們的需求,這個時候我們就需要基于源碼進行二次開發。
3.1 環境搭建
采用maven overlays特性(通路徑下的同名文件會使用最新的資源文件替換已有war目錄中下的資源文件)搭建,只需引入Maven【3】依賴:
3.2修改CAS服務器端登錄認證方式為數據庫認證
CAS服務端初始提供的是比較簡單的用戶名、密碼認證,這顯然是不能滿足車企需求的。在此我們需要修改使其支持基于數據庫的用戶名密碼校驗。
3.3 添加驗證碼校驗
為了車企的安全起見,防止Cas Server被惡意登錄及防暴力登錄【4】。這里采用驗證碼校驗。
1) 引入Maven依賴
2) 配置web.xml
下面的內容需要添加進src\main\webapp\WEB-INF\web.xml文件中:
<!-- Captcha -->
3) UsernamePasswordCaptchaCredential
創建UsernamePasswordCaptchaCredential繼承自
org.jasig.cas.authentication.RememberMeUsernamePasswordCredential,拓展了一個驗證字段captcha
@NotNull
private String captcha;
4) 添加驗證碼校驗
代碼略
5) 配置login-webflow.xml
修改文件src\main\webapp\WEB-INF\login-webflow.xml,該文件是Spring Web Flow的配置文件。在這里定義說明了全部CAS服務端的登錄校驗認證流程。接下來,需要在登錄屬性表單中添加驗證碼字段及添加修改有關涉及驗證碼校驗的流程替換原來的credential配置為我們新建的UsernamePasswordCaptchaCredential
3.4 CAS登錄頁定制
1) 拷貝資源文件
事先讓美工設計一套登錄頁面。然后將css、image、js拷貝到src\main\webapp\css src\main\webapp\images src\main\webapp\js目錄下。
2) 修改casLoginView.jsp
4 集成CAS客戶端
4.1 引入Maven依賴
采用Shiro集成CAS單點登錄客戶端,添加Maven依賴:
4.2 ShiroFilter
配置ShiroFilter攔截外來請求,下圖在ShiroCasFilterConfiguration類配置/api/**為authc,也就是api路徑下的所有請求都必須登錄才能訪問。而其他路徑下的請求則不受此約束。
Shiro集成CAS,其實就是將CasFilter加入到其Filter鏈中,對指定url訪問請求用CasFilter進行攔截,實現單點登錄、登出的校驗功能。
4.3 CasRealm
Shiro的核心配置是Realm,一般項目中繼承Authorizingrealm類,實現其中的doGetAuthenticationInfo和doGetAuthorizationInfo方法。doGetAuthenticationInfo方法用于用戶認證,可以設置登錄后Session中的數據,doGetAuthorizationInfo用于授權,角色、權限分配。
Shiro集成CAS也是自定義realm繼承CasRealm,由于認證在CAS服務端已經完成,CAS客戶端只需要把CAS認證返回的token結合起來,加入自己的角色、權限控制業務等等就行。
數據資源中心的車企項目現在都是基于SpringBoot框架開發的,但是很多老項目是基于傳統XML Spring【5】開發的,兩者集成CAS客戶端的方法不同但是基本原理是相同的。
5 配置與部署
1) 配置數據庫連接
2) 部署方式
將CAS服務打成war包,放入tomcat運行,根據需要修改war包名,比如叫castest.war,tomcat啟動以后,war包會被解壓。在webapps\castest\WEB-INF下可以看見deployerConfigContext.xml,可以直接修改配置文件然后重啟tomcat實現功能,數據庫連接也可以在這里修改。
6 總結
CAS是實現單點登錄的開源框架,對CAS系統進行二次開發,可以滿足車企多系統統一認證登錄的需求。Apache Shiro是主流的Java安全框架,采取Shiro去整合CAS客戶端的集成,可以大大提高集成的效力與可靠性。由于車企系統有的是基于SpringBoot的,有的是基于傳統XML Spring的,所以在客戶端集成過程中會有一定差異,但是基本原理是一樣的。通過單點登錄的建設,大大提升了用戶的體驗,提高了軟件系統的利用效力,在車企用戶中獲得了一致的好評。
參考文獻:
[1] 楊家煒.基于Spring Boot的web設計與實現[J].輕工科技,2016(7).
[2] 丁潔.基于Shiro的Web應用安全框架設計研究[J].信息與電腦,2018(13):18.
[3] 江日念,林霞,喬德新.Maven在Java項目中的引入及應用[J].電腦知識與技術,2013.
[4] 汪潁.對于虛擬服務器SSH暴力登錄攻擊的防范[J].中國科技縱橫,2013(1).
[5] 張文宇,許明健,薛昱.論Spring的零配置與XML配置[J].計算機系統應用,2015.
【通聯編輯:朱寶貴】