cas單點登錄(一)

1.1 什么是CAS

CAS 是 Yale 大學(xué)發(fā)起的一個開源項目臊旭,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點登錄方法落恼,CAS 在 2004 年 12 月正式成為 JA-SIG 的一個項目。CAS 具有以下特點:

【1】開源的企業(yè)級單點登錄解決方案离熏。

【2】CAS Server 為需要獨立部署的 Web 應(yīng)用佳谦。

【3】CAS Client 支持非常多的客戶端(這里指單點登錄系統(tǒng)中的各個 Web 應(yīng)用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等滋戳。

從結(jié)構(gòu)上看钻蔑,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署胧瓜,主要負責(zé)對用戶的認證工作府喳;CAS Client 負責(zé)處理對客戶端受保護資源的訪問請求,需要登錄時兜粘,重定向到 CAS Server孔轴。下圖是 CAS 最基本的協(xié)議過程:

image.jpg

SSO單點登錄訪問流程主要有以下步驟:

  1. 訪問服務(wù):SSO客戶端發(fā)送請求訪問應(yīng)用系統(tǒng)提供的服務(wù)資源路鹰。
  2. 定向認證:SSO客戶端會重定向用戶請求到SSO服務(wù)器。
  3. 用戶認證:用戶身份認證优构。
  4. 發(fā)放票據(jù):SSO服務(wù)器會產(chǎn)生一個隨機的Service Ticket钦椭。
  5. 驗證票據(jù):SSO服務(wù)器驗證票據(jù)Service Ticket的合法性彪腔,驗證通過后,允許客戶端訪問服務(wù)德挣。
  6. 傳輸用戶信息:SSO服務(wù)器驗證票據(jù)通過后盲厌,傳輸用戶認證結(jié)果信息給客戶端祸泪。

1.2 CAS服務(wù)端配置

1.2.1端口修改

如果我們不希望用8080端口訪問CAS, 可以修改端口

(1)修改TOMCAT的端口

打開tomcat 目錄 conf\server.xml 找到下面的配置

image.jpg

將端口8080懂扼,改為28083

(1)修改CAS配置文件

修改cas的WEB-INF/cas.properties

server.name=http://localhost:28083

1.2.2去除https認證

CAS默認使用的是HTTPS協(xié)議阀湿,如果使用HTTPS協(xié)議需要SSL安全證書(需向特定的機構(gòu)申請和購買) 瑰妄。如果對安全要求不高或是在開發(fā)測試階段间坐,可使用HTTP協(xié)議。我們這里講解通過修改配置地技,讓CAS使用HTTP協(xié)議。

1)修改cas的WEB-INF/deployerConfigContext.xml

找到下面的配置

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient"/>

這里需要增加參數(shù)p:requireSecure=“false”莫矗,requireSecure屬性意思為是否需要安全驗證作谚,即HTTPS食磕,false為不采用

2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

找到下面配置

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
      p:cookieSecure="true"
      p:cookieMaxAge="-1"
      p:cookieName="CASTGC"
      p:cookiePath="/cas" />

參數(shù)p:cookieSecure=“true”,同理為HTTPS驗證相關(guān)伊诵,TRUE為采用HTTPS驗證曹宴,F(xiàn)ALSE為不采用https驗證歉提。

參數(shù)p:cookieMaxAge=“-1”排龄,是COOKIE的最大生命周期,-1為無生命周期,即只在當前打開的窗口有效悼尾,關(guān)閉或重新打開其它窗口闺魏,仍會要求驗證∷静荩可以根據(jù)需要修改為大于0的數(shù)字翻伺,比如3600等,意思是在3600秒內(nèi)拉宗,打開任意窗口旦事,都不需要驗證急灭。

我們這里將cookieSecure改為false , cookieMaxAge 改為3600

3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

找到下面配置

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />

我們這里將cookieSecure改為false , cookieMaxAge 改為3600

1.3 CAS客戶端入門小Demo

1.3.1客戶端工程1搭建
1)搭建工程引入依賴

創(chuàng)建Maven工程 (war)casclient-demo1 引入cas客戶端依賴,tomcat運行端口28084

<dependencies>
  <!-- cas -->
  <dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.3.3</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

2)添加web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
  <display-name>casclient-demo1</display-name>

  <!-- 用于單點退出卖鲤,該過濾器用于實現(xiàn)單點登出功能畴嘶,可選配置 -->
  <listener>
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  </listener>

  <!-- 該過濾器用于實現(xiàn)單點登出功能区匣,可選配置蒋院。 -->
  <filter>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CAS Single Sign Out Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 該過濾器負責(zé)用戶的認證工作姑丑,必須啟用它 -->
  <filter>
    <filter-name>CASFilter</filter-name>       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
      <param-name>casServerLoginUrl</param-name>
      <param-value>http://localhost:28083/cas/login</param-value>
      <!--這里的server是服務(wù)端的IP -->
    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:28084</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CASFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 該過濾器負責(zé)對Ticket的校驗工作彻坛,必須啟用它 -->
  <filter>
    <filter-name>CAS Validation Filter</filter-name>
    <filter-class>     org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
      <param-name>casServerUrlPrefix</param-name>
      <param-value>http://localhost:28083/cas</param-value>
    </init-param>
    <init-param>
      <param-name>serverName</param-name>
      <param-value>http://localhost:28084</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CAS Validation Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!-- 該過濾器負責(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>
  <filter-mapping>
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

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

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

3)編寫index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>一品優(yōu)購</title>
</head>
<body>
歡迎來到一品優(yōu)購
<%=request.getRemoteUser()%>
</body>
</html>

request.getRemoteUser()為獲取遠程登錄名

1.3.2客戶端工程2搭建

(1)創(chuàng)建Maven工程 (war)casclient-demo2 引入cas客戶端依賴并制定tomcat運行端口為28085

(2)創(chuàng)建web.xml,參照casclient-demo1 ,將serverName的值改為http://localhost:28085啦租,一共兩處

(3)創(chuàng)建index.jsp ,內(nèi)容顯示“歡迎來到二品優(yōu)購”

1.3.3單點登錄測試

(1)啟動cas部署的tomcat

(2)啟動客戶端工程1和客戶端工程2

(3)地址欄輸入http://localhost:28084/http://localhost:28085/ 篷角,地址均會跳轉(zhuǎn)到CAS登錄頁

(4)輸入用戶名和密碼后系任,頁面跳轉(zhuǎn)回28084 阱缓,再次訪問28085也可以打開主頁面举农。

1.3.4單點退出登錄

地址欄輸入 http://localhost:28083/cas/logout

即可看到退出后的提示頁面

image.jpg

我們可以將這個鏈接添加到index.jsp中

<a href="http://localhost:28083/cas/logout">退出登錄</a>

但我們更希望退出登錄后,能自動跳轉(zhuǎn)到某個頁面敞嗡,那如何處理呢颁糟?

修改cas系統(tǒng)的配置文件cas-servlet.xml

<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
        p:servicesManager-ref="servicesManager"
        p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

改為true后,可以在退出時跳轉(zhuǎn)頁面到目標頁面喉悴,修改index.jsp的退出鏈接

<a href="http://localhost:28083/cas/logout?service=http://www.itheima.com">退出登錄</a>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棱貌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子箕肃,更是在濱河造成了極大的恐慌婚脱,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺像,死亡現(xiàn)場離奇詭異障贸,居然都是意外死亡,警方通過查閱死者的電腦和手機吟宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門殃姓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來睡蟋,“玉大人,你說我怎么就攤上這事豺瘤∏培停” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵锡宋,是天一觀的道長癌刽。 經(jīng)常有香客問我,道長杰赛,這世上最難降的妖魔是什么辰晕? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任辆童,我火速辦了婚禮儿咱,結(jié)果婚禮上怠缸,老公的妹妹穿的比我還像新娘吏颖。我一直安慰自己奉呛,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布麦射。 她就那樣靜靜地躺著峻呛,像睡著了一般穆碎。 火紅的嫁衣襯著肌膚如雪谜悟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天蔑水,我揣著相機與錄音搀别,去河邊找鬼再愈。 笑死翎冲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骨望,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼牲剃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了止吁?” 一聲冷哼從身側(cè)響起被辑,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赏殃,沒想到半個月后敷待,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體间涵,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡仁热,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抗蠢。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡举哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迅矛,到底是詐尸還是另有隱情妨猩,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布秽褒,位于F島的核電站壶硅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏销斟。R本人自食惡果不足惜庐椒,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚂踊。 院中可真熱鬧约谈,春花似錦、人聲如沸犁钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涝动。三九已至迈勋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捧存,已是汗流浹背粪躬。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昔穴,地道東北人镰官。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像吗货,于是被迫代替她去往敵國和親泳唠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359