CAS單點登錄示例

摘要

CAS Server Cas Client Pac4j

什么是單點登錄

單點登錄(Single Sign On)奄喂,簡稱 SSO铐殃,常用于多個系統(tǒng)中,用戶只需登錄一次跨新,就可以訪問其他信任的系統(tǒng)富腊。比如,員工登錄過OA系統(tǒng)后域帐,可以直接訪問郵件系統(tǒng)赘被,而不再需要登錄郵件系統(tǒng)。這里的OA系統(tǒng)和郵件系統(tǒng)俯树,可以認(rèn)為是相互信任的子系統(tǒng)帘腹,他們共用一套用戶數(shù)據(jù),這套用戶數(shù)據(jù)的權(quán)限認(rèn)證由統(tǒng)一的認(rèn)證服務(wù)器來認(rèn)證许饿。

CAS協(xié)議

現(xiàn)階段比較流行的單點登錄解決方案是CAS(Central Authentication Service)阳欲,官網(wǎng)中有如下說明

Enterprise Single Sign-On - CAS provides a friendly open source community that actively supports and contributes to the project. While the project is rooted in higher-ed open source, it has grown to an international audience spanning Fortune 500 companies and small special-purpose installations.

CAS提供了CAS協(xié)議來完成單點登錄,主要流程如下

  1. 用戶第一次向瀏覽器訪問應(yīng)用1(https://app.example.com)陋率,應(yīng)用1判斷用戶沒有登錄球化,重定向到CAS server(https://cas.example.com/cas/login?service=https://app.example.com)

  2. CAS server中判斷當(dāng)前用戶的sso的session不存在,展示用戶名密碼輸入框

  3. 用戶輸入用戶名密碼向CAS server登錄瓦糟,驗證通過后筒愚,CAS server 生成sso的session,向瀏覽器設(shè)置cookie菩浙,CASTGC=TGT-...
    其中cookie的值就是sso中session的key巢掺。同時CAS server會對應(yīng)用1生成一個ticket句伶,再去重定向到應(yīng)用1中,應(yīng)用1拿到這個ticket再次請求CAS server獲取授權(quán)數(shù)據(jù)陆淀。成功后考余,設(shè)置cookie,jessionid=...轧苫。到此楚堤,應(yīng)用1第一次認(rèn)證結(jié)束。

  4. 當(dāng)應(yīng)用1第二次認(rèn)證的時候直接校驗jessionid是否合法即可含懊。

  5. 當(dāng)應(yīng)用2第一次訪問的時候身冬,同樣會重定向到CAS server中去,只不過岔乔,此時酥筝,由于,應(yīng)用1已經(jīng)認(rèn)證通過了重罪,同時sso的session已經(jīng)保存了樱哼,所以,CAS server不會再去要求用戶登錄剿配,而是直接對應(yīng)用2生成一個ticket,后面的邏輯就和前面一樣了阅束。

代碼演示

下面的代碼都可以在cas-pac4j-example下載
本機環(huán)境說明

  • jdk 1.8
  • maven 3.6.3
  • mysql 5.7.29
  • cas server 5.3.14
  • cas client 3.6.1
  • shiro 1.5.3
  • pac4j 4.0.3

cas服務(wù)端

直接clone官方提供的overlaygit clone https://github.com/apereo/cas-overlay-template.git
由于最新版6.3.x需要jdk11的支持呼胚,所以切換了5.3的分支
添加了src/main/resources/目錄,在改目錄下創(chuàng)建了application.properties文件和services目錄息裸,用于cas server的自定義認(rèn)證方式蝇更。
由于認(rèn)證數(shù)據(jù)依賴數(shù)據(jù)庫,請先運行sql文件呼盆,更改application.properties的數(shù)據(jù)庫連接信息年扩。
修改pom文件,添加如下依賴

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-rest</artifactId>
            <version>${cas.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc</artifactId>
            <version>${cas.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc-drivers</artifactId>
            <version>${cas.version}</version>
        </dependency>

命令行運行mvn clean package & java -jar target/cas.war等待服務(wù)啟動后访圃,訪問http://locahost:8443/cas厨幻,會跳轉(zhuǎn)登錄,輸入u/p登錄成功腿时。到此况脆,cas服務(wù)端算是ok了。

cas客戶端

新建spring boot項目cas-client2cas-client3批糟,其中cas-client2的端口為8082格了,cas-client3的端口為8083,pom中添加如下依賴

        <dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-support-springboot</artifactId>
            <version>${cas.client.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

添加注解@EnableCasClient啟用casClient徽鼎,application中添加如下cas服務(wù)配置

cas.server-url-prefix=http://localhost:8443/cas
cas.server-login-url=${cas.server-url-prefix}/login
cas.client-host-url=http://localhost:${server.port}

啟動客戶端cas-client2和cas-client3盛末,訪問http://localhost:8082弹惦,會跳轉(zhuǎn)cas登錄,然后在訪問http://localhost:8083悄但,會發(fā)現(xiàn)已經(jīng)認(rèn)證通過棠隐,不會跳轉(zhuǎn)cas登錄,達(dá)到了單點登錄的效果算墨。

客戶端shiro集成cas服務(wù)認(rèn)證

現(xiàn)實的系統(tǒng)中可能不是像上面那樣簡單的配置宵荒,可能客戶端先前已經(jīng)集成了shiro等權(quán)限框架,后面再接入cas認(rèn)證净嘀,這種情況怎么處理呢报咳?
新建spring boot項目cas-client1
pom中添加入下依賴

        <dependency>
            <groupId>io.buji</groupId>
            <artifactId>buji-pac4j</artifactId>
            <version>${buji.version}</version>
        </dependency>
        <dependency>
            <groupId>org.pac4j</groupId>
            <artifactId>pac4j-cas</artifactId>
            <version>${pac4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>${shiro.version}</version>
        </dependency>

application.properties的配置如下

server.port=8081

cas.server-url-prefix=http://localhost:8443/cas
cas.server-login-url=${cas.server-url-prefix}/login
cas.client-host-url=http://localhost:${server.port}
cas.client-name=app-client1

shiro.loginUrl=/login.html

主類中CasClient1Application添加了cas認(rèn)證的相關(guān)配置,而TestController則包含了單純的shiro登錄和cas的rest方式登錄挖藏。
啟動后暑刃,訪問http://localhost:8081/cas.html,會跳轉(zhuǎn)到CAS Server去認(rèn)證膜眠,認(rèn)證完成后岩臣,訪問http://localhost:8081/test可以測試權(quán)限數(shù)據(jù)是否正確,CAS Server除了采用CAS本身的login登錄界面外宵膨,還支持rest的方式架谎,獲取認(rèn)證,訪問http://localhost:8081/login.html辟躏,輸入u/p后會通過rest的方式認(rèn)證谷扣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捎琐,隨后出現(xiàn)的幾起案子会涎,更是在濱河造成了極大的恐慌,老刑警劉巖瑞凑,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件末秃,死亡現(xiàn)場離奇詭異,居然都是意外死亡籽御,警方通過查閱死者的電腦和手機练慕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篱蝇,“玉大人贺待,你說我怎么就攤上這事×憬兀” “怎么了麸塞?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涧衙。 經(jīng)常有香客問我哪工,道長奥此,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任雁比,我火速辦了婚禮稚虎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偎捎。我一直安慰自己蠢终,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布茴她。 她就那樣靜靜地躺著寻拂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丈牢。 梳的紋絲不亂的頭發(fā)上祭钉,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音己沛,去河邊找鬼慌核。 笑死,一個胖子當(dāng)著我的面吹牛申尼,可吹牛的內(nèi)容都是我干的垮卓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼师幕,長吁一口氣:“原來是場噩夢啊……” “哼扒接!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起们衙,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碱呼,沒想到半個月后蒙挑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡愚臀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年忆蚀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑裂。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡馋袜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舶斧,到底是詐尸還是另有隱情欣鳖,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布茴厉,位于F島的核電站泽台,受9級特大地震影響什荣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怀酷,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一稻爬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜕依,春花似錦桅锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吹缔,卻和暖如春商佑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厢塘。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工茶没, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晚碾。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓抓半,卻偏偏與公主長得像,于是被迫代替她去往敵國和親格嘁。 傳聞我的和親對象是個殘疾皇子笛求,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345