CAS 5.2.x 單點登錄 - 搭建服務(wù)端和客戶端

一震贵、簡介

單點登錄(Single Sign On)他爸,簡稱為 SSO份企,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一盾致。SSO的定義是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。

CAS 是一個開源的企業(yè)級單點登錄系統(tǒng),目前最新版本為 5.2.x
CAS 包含兩個部分:CAS Server 和 CAS Client砌烁,它們之間獨立部署。CAS 客戶端攔截未認證的用戶請求催式,并重定向至 CAS 服務(wù)端函喉,由 CAS 服務(wù)端對用戶身份進行統(tǒng)一認證。

二荣月、搭建服務(wù)端

對于本地搭建 CAS 服務(wù)端管呵,官方提供了基于 Maven 和 Gradle 的 Overlay 構(gòu)建方式,本文用的是 CAS Maven WAR Overlay哺窄。

2.1 什么是 WAR Overlay?

Overlay 技術(shù)可以把多個項目 war 合并成為一個項目捐下,如果項目存在同名文件,那么主項目中的文件將覆蓋掉其他項目的同名文件萌业。

使用 Overlay 無需對 CAS 源碼進行編譯坷襟,也避免了對 CAS 源碼進行侵入性改造。

2.2 環(huán)境清單

  • JDK 1.8
  • Tomcat 8.0+
  • IntelliJ IDEA 2017.2

2.3 Overlay 構(gòu)建

下載 CAS Maven WAR Overlay生年,修改 pom.xml 婴程,設(shè)置 CAS 版本為 5.2.2。建議去除掉 pom.xml 文件中的 wrapper-maven-plugin 和無用的 profile 配置抱婉。

<properties>
    <cas.version>5.2.2</cas.version>
</properties>

首次導(dǎo)入 IDEA档叔,可以看到后臺正在下載官方 cas.war。

CAS Maven Overlay

工程 overlays 目錄下的文件是由 maven 編譯后才產(chǎn)生的蒸绩,可以在 pom.xml 中配置官方 cas.war 中的文件的那些文件可以排除衙四,不要在 overlays 中生成:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <warName>cas</warName>
        <failOnMissingWebXml>false</failOnMissingWebXml>
        <recompressZippedFiles>false</recompressZippedFiles>
        <archive>
            <compress>false</compress>
            <manifestFile>${manifestFileToUse}</manifestFile>
        </archive>
        <overlays>
            <overlay>
                <groupId>org.apereo.cas</groupId>
                <artifactId>cas-server-webapp${app.server}</artifactId>
                <!--原有的服務(wù)不再初始化進去-->
                <excludes>
                    <exclude>WEB-INF/classes/services/*</exclude>
                    <exclude>WEB-INF/classes/application.*</exclude>
                </excludes>
            </overlay>
        </overlays>
    </configuration>
</plugin>

打開 Project Structure,可以觀察到該工程具有兩個 Web Root患亿,但是 src/main/webapp 目錄并不存在传蹈,需要進行手動創(chuàng)建。

Project Structure

拷貝 overlays 目錄下的 application.properties 配置文件至 resources 目錄窍育,用于覆蓋 CAS WAR 中的同名文件。最終工程目錄結(jié)構(gòu)如下:

Project Structure

為工程配置 tomcat 8.0 并啟動宴胧,注意 CAS 5.2.x 不支持低于 tomcat 8.0 的版本漱抓。
看到控制臺打印 READY 表明啟動成功。

CAS Server Ready

訪問 http://localhost:8080/cas/login 進入登錄界面恕齐。

登錄界面

其中Non-secure Connection提示需要配置 SSL乞娄,Static Authentication提示需要對用戶配置進行修改,可以修改為 JDBC、REST 等方式仪或。目前用戶配置寫死在 application.properties 配置文件中确镊,用戶名為 casuser,密碼為 Mellon范删。

##
# CAS Authentication Credentials
#
cas.authn.accept.users=casuser::Mellon

2.4 Services配置

客戶端接入 CAS 首先需要在服務(wù)端進行注冊蕾域,否則客戶端訪問將提示“未認證授權(quán)的服務(wù)”警告:

未認證授權(quán)的服務(wù)

在 resources 文件夾下創(chuàng)建 services 文件夾進行服務(wù)定義,該目錄中可包含多個 JSON 文件到旦,其命名必須滿足以下規(guī)則:

JSON fileName = serviceName + "-" + serviceNumericId + ".json"

創(chuàng)建 services/Localhost-10000003.json 文件旨巷,表示允許所有以 http://localhost 開頭的認證請求:

{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId": "^(http)://localhost.*",
  "name": "本地服務(wù)",
  "id": 10000003,
  "description": "這是一個本地允許的服務(wù),通過localhost訪問都允許通過",
  "evaluationOrder": 1
}

對其中屬性的說明如下添忘,更多詳細內(nèi)容見官方文檔-Service-Management采呐。

  • @class:必須為org.apereo.cas.services.RegisteredService的實現(xiàn)類
  • serviceId:對服務(wù)進行描述的表達式,可用于匹配一個或多個 URL 地址
  • name: 服務(wù)名稱
  • id:全局唯一標(biāo)志
  • evaluationOrder:定義多個服務(wù)的執(zhí)行順序

最后搁骑,根據(jù)官方文檔-service-registry斧吐,還需修改 application.properties 文件告知 CAS 服務(wù)端從本地加載服務(wù)定義文件:

#開啟識別json文件,默認false
cas.serviceRegistry.initFromJson=true
#自動掃描服務(wù)配置仲器,默認開啟
#cas.serviceRegistry.watcherEnabled=true
#120秒掃描一遍
#cas.serviceRegistry.repeatInterval=120000
#延遲15秒開啟
#cas.serviceRegistry.startDelay=15000
#資源加載路徑
#cas.serviceRegistry.config.location=classpath:/services

啟動時打印以下日志煤率,說明服務(wù)注冊成功。

2018-03-18 23:36:08,660 INFO [org.apereo.cas.services.AbstractServicesManager] - <Loaded [0] service(s) from [InMemoryServiceRegistry].>
2018-03-18 23:36:08,876 INFO [org.apereo.cas.config.CasServiceRegistryInitializationConfiguration] - <Attempting to initialize the service registry [InMemoryServiceRegistry] from service definition resources found at [class path resource [services]]>
2018-03-18 23:36:08,877 WARN [org.apereo.cas.services.ServiceRegistryInitializer] - <Service registry [InMemoryServiceRegistry] will be auto-initialized from JSON service definitions. This behavior is only useful for testing purposes and MAY NOT be appropriate for production. Consider turning off this behavior via the setting [cas.serviceRegistry.initFromJson=false] and explicitly register definitions in the services registry.>
2018-03-18 23:36:09,283 INFO [org.apereo.cas.services.AbstractServicesManager] - <Loaded [3] service(s) from [InMemoryServiceRegistry].>

三娄周、搭建客戶端

官方文檔中提供了 CAS Java 客戶端樣例涕侈,即 cas-sample-java-webapp
修改 pom.xml煤辨,配置 tomcat7-maven-plugin:

<!--  tomcat7 plugin -->
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>8181</port>
        <uriEncoding>UTF-8</uriEncoding>
        <server>tomcat7</server>
        <path>/node1</path>
    </configuration>
</plugin>

CAS Client 通過攔截器將未認證的請求重定向到 CAS Server裳涛,這里對 cas-sample-java-webapp 的 web.xml 文件進行修改,將服務(wù)端众辨、客戶端地址替換為實際測試的地址:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!--
   <context-param>
       <param-name>renew</param-name>
       <param-value>true</param-value>
   </context-param>
-->
    <!--單點登出過濾器-->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:8080/cas</param-value>
        </init-param>
    </filter>

    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <!--用來跳轉(zhuǎn)登錄-->
    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>-->
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>http://localhost:8080/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <!--這是客戶端的部署地址端三,認證時會帶著這個地址,認證成功后會跳轉(zhuǎn)到這個地址-->
            <param-value>http://localhost:8181/node1</param-value>
        </init-param>
    </filter>

    <!--Ticket校驗過濾器-->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
        <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>http://localhost:8080/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://localhost:8181/node1</param-value>
        </init-param>
        <init-param>
            <param-name>redirectAfterValidation</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>useSession</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>authn_method</param-name>
            <param-value>mfa-duo</param-value>
        </init-param>
    </filter>

    <!-- 該過濾器負責(zé)實現(xiàn)HttpServletRequest請求的包裹鹃彻,比如允許開發(fā)者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名郊闯,可選配置-->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>

    <!-- 該過濾器使得開發(fā)者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。 比如AssertionHolder.getAssertion().getPrincipal().getName()-->
    <!--<filter>
        <filter-name>CASAssertion Thread LocalFilter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CASAssertion Thread LocalFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>-->

    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

此時訪問
http://localhost:8181/node1
會跳轉(zhuǎn)至
http://localhost:8080/cas/login?service=http%3A%2F%2Flocalhost%3A8181%2Fnode1%2F
輸入用戶信息蛛株,登錄成功团赁,返回
http://localhost:8181/node1/;jsessionid=6628138DCAAA5BA3481CD4C9238FEBFF

CAS Client

利用相同的方法配置第二個客戶端,訪問地址為 http://localhost:8282/node2谨履,可知在 node1 登錄成功的情況下欢摄,無需再次輸入用戶密碼即可訪問 node2 后臺頁面。

至此笋粟,開發(fā)環(huán)境搭建完畢怀挠。由于客戶端只是對 web.xml 中的過濾器進行配置析蝴,可以很方便地集成到各個業(yè)務(wù)系統(tǒng)中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绿淋,一起剝皮案震驚了整個濱河市闷畸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吞滞,老刑警劉巖佑菩,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冯吓,居然都是意外死亡倘待,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門组贺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凸舵,“玉大人,你說我怎么就攤上這事失尖“⊙伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵掀潮,是天一觀的道長菇夸。 經(jīng)常有香客問我,道長仪吧,這世上最難降的妖魔是什么庄新? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮薯鼠,結(jié)果婚禮上择诈,老公的妹妹穿的比我還像新娘。我一直安慰自己出皇,他們只是感情好羞芍,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郊艘,像睡著了一般荷科。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纱注,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天畏浆,我揣著相機與錄音,去河邊找鬼狞贱。 笑死刻获,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斥滤。 我是一名探鬼主播将鸵,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼佑颇!你這毒婦竟也來了顶掉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挑胸,失蹤者是張志新(化名)和其女友劉穎痒筒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茬贵,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡簿透,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了解藻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片老充。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖螟左,靈堂內(nèi)的尸體忽然破棺而出啡浊,到底是詐尸還是另有隱情,我是刑警寧澤胶背,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布巷嚣,位于F島的核電站,受9級特大地震影響钳吟,放射性物質(zhì)發(fā)生泄漏廷粒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一红且、第九天 我趴在偏房一處隱蔽的房頂上張望坝茎。 院中可真熱鬧,春花似錦直焙、人聲如沸景东。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斤吐。三九已至,卻和暖如春厨喂,著一層夾襖步出監(jiān)牢的瞬間和措,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工蜕煌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留派阱,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓斜纪,卻偏偏與公主長得像贫母,于是被迫代替她去往敵國和親文兑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容