cas單點登錄系統:客戶端(client)詳細配置(包含統一單點注銷配置)

最近一直在研究cas登錄中心這一塊的應用,分享一下記錄的一些筆記和心得。后面會把cas-server端的配置和重構,另外還有這幾天再搞nginx+cas的https反向代理配置,以及cas的證書相關的知識分享出來。

Cas由兩部分組成,Cas Server和Cas Client。Cas Server是Cas自己的服務端,而Cas Client是Cas客戶端,往往客戶端需要和我們具體的業務系統進行集成,這里我們主要詳述cas 客戶端的配置以及實例

第一步:

我們得有一個現成的web項目,然后我們要加入cas-client-core-xxx.jar到classpath;

maven項目用這個:

<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.3.3</version>
</dependency>

這里我使用?cas-client-core-3.3.3.jar,順便推薦一個用來搜索和下載引用包的網站,我一般從這里下載引用包:http://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core/3.3.3


第二步:配置單點登錄Filter和注銷監聽器/過濾器

?我們需要在應用的web.xml文件中配置四個Filter,這四個Filter必須按照固定的順序來進行配置,而且它們必須配置在應用的其它Filter之前。它們的先后順序要求如下:
1、AuthenticationFilter
2、TicketValidationFilter
3、HttpServletRequestWrapperFilter
4、AssertionThreadLocalFilter

1.1、?配置AuthenticationFilter

?1.1.1、AuthenticationFilter有兩個必須指定的參數:

casServerLoginUrl用來指定Cas Server登錄地址serverName或service用來指定認證成功后需要跳轉地址。

補充:

service和serverName一般只需要指定一個,如果都指定了,參數service將具有更高的優先級,即以service指定的參數值為準。

service和serverName的區別:

service指定的是一個確定的URL,認證成功后就會確切的跳轉到service指定的URL;

serverName用來指定主機名,格式為{http/https}:{主機名}:{端口號}

如:https://localhost:8335,當指定的是serverName時,AuthenticationFilter將會把它附加上當前請求的URI,以及對應的查詢參數來構造一個確定的URL,如指定serverName為“http://localhost”,而當前請求的URI為“/login”,查詢參數為“user=123&pwd=123”,則對應認證成功后的跳轉地址將為“http://localhost/login?user=123&pwd=123”。)

?AuthenticationFilter可以指定如下可選參數:
renew:當指定renew為true時,在請Cas Server時將帶上參數“renew=true”,默認為false。
gateway:指定gateway為true時,在請求Cas Server時將帶上參數“gateway=true”,默認為false。
artifactParameterName:指定ticket對應的請求參數名稱,默認為ticket。
serviceParameterName:指定service對應的請求參數名稱,默認為service。


例如,我是這樣配置的:

<filter><filter-name>casAuthenticationFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https://cas.eguid.cn:8335/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://sso.eguid.cn:8080/</param-value></init-param></filter><filter-mapping><filter-name>casAuthenticationFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>


1.2、配置TicketValidationFilter

請求通過AuthenticationFilter的認證之后,如果請求中攜帶了參數ticket則將會由TicketValidationFilter來對攜帶的ticket進行校驗。

TicketValidationFilter只是對驗證ticket的這一類Filter的統稱,其并不對應Cas Client中的一個具體類型。

Cas Client中有多種驗證ticket的Filter,都繼承自AbstractTicketValidationFilter,它們的驗證邏輯都是一致的,都有AbstractTicketValidationFilter實現,不同的是使用的TicketValidator不一樣。這里我們使用Cas10TicketValidationFilter,也可以使用Cas20ProxyReceivingTicketValidationFilter或者Saml11TicketValidationFilter。

<filter><filter-name>casTicketValidationFilter</filter-name><filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>https://cas.eguid.cn:8335/cas-server/</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://sso.eguid.cn:8080/</param-value></init-param></filter><filter-mapping><filter-name>casTicketValidationFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

必須指定的參數:

casServerUrlPrefix 用來指定Cas Server對應URL地址的前綴,如上面示例的“https://cas.eguid.cn:8335/cas-server
serverName或service:與前面的用法相同。

??

可選參數:
redirectAfterValidation :表示是否驗證通過后重新跳轉到該URL,但是不帶參數ticket,默認為true。
useSession : ? ? ? ? ? ? ? ?在驗證ticket成功后會生成一個Assertion對象,如果useSession為true,則會將該對象存放到Session中。如果為false,則要求每次請求都需要攜帶ticket進行驗證,顯然useSession為false跟redirectAfterValidation為true是沖突的。默認為true。
exceptionOnValidationFailure :表示ticket驗證失敗后是否需要拋出異常,默認為true。
renew: ? ? ? ? ? ? ? ? ? ? ? ? 當值為true時將發送“renew=true”到Cas Server,默認為false。
?
1.3、配置HttpServletRequestWrapperFilter

?HttpServletRequestWrapperFilter用于將每一個請求對應的HttpServletRequest封裝為其內部定義的CasHttpServletRequestWrapper,該封裝類將利用之前保存在Session或request中的Assertion對象重寫HttpServletRequest的getUserPrincipal()、getRemoteUser()和isUserInRole()方法。這樣在我們的應用中就可以非常方便的從HttpServletRequest中獲取到用戶的相關信息。

 <filter><filter-name>casHttpServletRequestWrapperFilter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>casHttpServletRequestWrapperFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

1.4、配置AssertionThreadLocalFilter

?AssertionThreadLocalFilter可以在應用的其它地方獲取Assertion對象,找個過濾器會把Assertion對象存放到當前的線程變量中,我們在程序的任何地方都可以從線程變量中獲取當前Assertion,就不需要再從Session或request中進行解析了。這個線程變量是由AssertionHolder持有的,我們在獲取當前的Assertion時也只需要通過AssertionHolder的getAssertion()方法獲取即可,如:
? ?Assertion assertion = AssertionHolder.getAssertion();

我是這樣配置的:

<filter><filter-name>casAssertionThreadLocalFilter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>casAssertionThreadLocalFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

1.5、配置單點注銷監聽器和過濾器用于統一注銷

<!-- 單點注銷監聽器 -->
<listener>  
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
</listener> 
<!-- 單點注銷過濾器 -->
<filter><filter-name>caslogoutFilter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping><filter-name>caslogoutFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>



當你真的登錄成功后,你會發現,你回不到原來頁面了!怎么辦?其實我們只要在前端給他一個參數就行了,可以這樣簡單實現這個功能:

//登錄中心url
var loginCenter = "https://cas.eguid.cn:8335/cas-server";
function getUrl() {var hostname = location.href;return hostname;
}
//登陸
function login() {location.href = loginCenter + "/login?service=" + getUrl();
}
//登錄中心執行登出操作
function logoutServ()
{alert("開始登出");var loginUrl = loginCenter + "/login?service=" + getUrl();location.href = loginCenter + "/logout?service=" + loginUrl;
}
在頁面上的你得有登錄和退出兩個按鈕,分別調用login()和logoutServ()方法。

其實這里還有個小問題,就是雖然你在cas-server端注銷了,你會發現它依然會認為你現在是登錄狀態,所以沒有攔截你的請求。

這是因為它時基于session驗證的,你的server端session已經注銷了,但是客戶端應用這里的session還沒有注銷

一般我們會使用共享session的方法解決這個問題,另外有個簡單的方法就是你可以在后臺寫個用來注銷當前用戶session的接口。




轉載于:https://www.cnblogs.com/eguid/p/10195648.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396163.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396163.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396163.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

open 端口打開Linux,linux – nmap顯示打開的端口,但netstat沒有

如果我使用nmap掃描我的服務器,則表明已打開21端口.但是當我登錄到這個服務器并運行netstat時,我什么也看不見.$nmap -sT serverStarting Nmap 4.76 ( http://nmap.org ) at 2009-06-24 11:54 MSDInteresting ports on server (x.x.x.x):Not shown: 994 filtered portsPORT STA…

技能學習重要的古語_學習方法:最重要的開發人員技能

技能學習重要的古語by Preethi Kasireddy通過Preethi Kasireddy 學習方法&#xff1a;最重要的開發人員技能 (Learning How to Learn: The Most Important Developer Skill) Being an efficient learner is at least as important as being an efficient coder.成為高效的學習…

Git submodule 的筆記

這次不造輪子&#xff0c;寫寫文章。file最近想把自己的 blog 整理到 github 上&#xff0c;但由于其中依賴了一些主題以及插件&#xff0c;這時候 git submodule 就能很好的處理這種情況了。 submodule 是什么&#xff1f; submodule 顧名思義&#xff0c;子模塊。在一個項目依…

Leetcode690.Employee Importance員工的重要性

給定一個保存員工信息的數據結構&#xff0c;它包含了員工唯一的id&#xff0c;重要度 和 直系下屬的id。 比如&#xff0c;員工1是員工2的領導&#xff0c;員工2是員工3的領導。他們相應的重要度為15, 10, 5。那么員工1的數據結構是[1, 15, [2]]&#xff0c;員工2的數據結構是…

linux進程管理類命令大全,Linux進程管理類命令

一、htop命令選項-d #&#xff1a;指定延遲時間間隔&#xff1b;-u UserName&#xff1a;僅顯示指定用戶的進程&#xff1b;-s COLUME&#xff1a;以指定字段進行排序&#xff1b;子命令&#xff1a;l&#xff1a;顯示選定的進程打開的文件列表&#xff1b;s&#xff1a;跟蹤選…

C#操作Excel

1.System.Data.DataTable連接數據庫 ExcelFile 是excel的完整路徑//OleDbConnection conExcel new OleDbConnection("ProviderMicrosoft.Jet.OLEDB.4.0;Data Source" ExcelFile ";Extended PropertiesExcel 8.0");//if (conExcel.State ConnectionStat…

android抓包工具——使用fiddler4在安卓手機抓包

Fiddler是一款非常流行并且實用的http抓包工具&#xff0c;它的原理是在本機開啟了一個http的代理服務器&#xff0c;然后它會轉發所有的http請求和響應&#xff0c;因此&#xff0c;它比一般的firebug或者是chrome自帶的抓包工具要好用的多。不僅如此&#xff0c;它還可以支持…

rust風化速度_反駁《Golang、Rust的執行速度的對照,讓人大吃一驚。》——不會別瞎說...

首先我無意引戰&#xff0c;但是今天看到某位同學的文章里有某些錯誤&#xff0c;不得不指正一下。1. 測量時間的時候我們使用 std::time::SystemTime::elapsed 即可&#xff0c;不必蹩腳的使用兩個 system 輸出出來還得手動算一下。(當然你說對Rust不熟也就無所謂了)2. 最重要…

css flexbox模型_代碼簡介:CSS Flexbox有點像旅行

css flexbox模型Here are three stories we published this week that are worth your time:這是我們本周發布的三個值得您關注的故事&#xff1a; CSS Flexbox explained by road tripping across the country: 7 minute read CSS Flexbox在全國各地的旅途中進行了解釋&#…

Sharepoint 2013設置customErrors

原文地址&#xff1a;http://www.cnblogs.com/renzh/archive/2013/03/05/2944309.html#3407239 一、首先設置IIS中的Web.config文件 找到對應的IIS應用程序目錄&#xff0c;如&#xff1a;C:\inetpub\wwwroot\wss\VirtualDirectories\3000 在此文件夾下包含一個web.config文件&…

ddt數據驅動

數據驅動原理 1.測試數據為多個字典的list類型 2.測試類前加修飾ddt.ddt 3.case前加修飾ddt.data() 4.運行后用例會自動加載成三個單獨的用例 5.測試結果&#xff1a; Testing started at 21:51 ...start!{username: selenium\xe7\xbe\xa4, psw: 232607095}end!start!{username…

http協議報文體_HTTP報文基本概念學習

HTTP是什么HTTP是HyperText Transfer Protocol的縮寫,中文就是超文本傳輸協議,所謂的超,是個學術用語,是基于某種事物增加了更多的信息維度,比如超像素xxx之類的.協議是什么,協議說白了就是約定,約定就是模板,就是表格,就和你去銀行辦手續一樣,客戶不知道要提供什么信息,銀行又…

yeoman_使用yeoman輕松創建Yeoman生成器

yeomanby Krist Wongsuphasawat克里斯特旺蘇帕薩瓦(Krist Wongsuphasawat) 使用yeoman輕松創建Yeoman生成器 (Creating Yeoman generators easily with yeoman-easily) I’ve used Yeoman to start many of my projects. It’s an amazing web scaffolding tool.我已經用Yeoma…

linux 輕量化圖形界面,YOXIOS 入門教程--基于Linux的 輕量化GUI圖形系統和硬件平臺(41頁)-原創力文檔...

YOXIOS --基于 Linux 的輕量化 GUI圖形系統和硬件平臺YOXIOS 入門教程基于 Linux 的 輕量化 GUI圖形系統和硬件平臺(V1.0 2020-05)提示&#xff1a;閱讀此文檔需要有一定的單片機開發、C/C編程語言、和使用 IDE開發工具的基礎YOXIOS (C) 2020 游芯科技第 1 頁 共 41 頁YOXIOS -…

第一階段 XHTML.定位樣式

一位初學php的隨堂筆記&#xff0c;記錄自己的成長&#xff01; 1.清除浮動 (1)格式 clear:both清除兩邊|left清除左邊 right清除右邊 高度塌陷:父元素中的子元素都浮動&#xff0c;而父元素 沒有設置高&#xff0c;那父元素的高為0 &#xff08;2&#xff09;萬能清除(在父元素…

Canvas入門06-線段與像素邊界

我們知道&#xff0c;使用以下2個API可以繪制一條線段&#xff1a; moveTo(x, y) 向當前路徑中增加一條子路徑&#xff0c;該子路徑只包含一個點&#xff0c;此為線段的起始點lineTo(x, y) 將線段的下一個點加入子路徑中context.strokeStyle rgb(200, 200, 0); context.lineWi…

函數表達書-讀書筆記

定義函數的方式有兩種&#xff1a;一種是函數聲明&#xff0c;另一種就是函數表達式。函數聲明的語法如下&#xff1a; function functionName(arg0,arg1,arg2){//函數體 } 函數聲明&#xff0c;有一個重要特征就是函數聲明提升。也就是在執行代碼之前會先讀取函數聲明&#xf…

vue截取一個字符串_vue 截取字符串

let str abcdef;// 0str str.slice(0);//返回整個字符串 abcdefstr str.substring(0);//返回整個字符串 abcdefstr str.substr(0);//返回整個字符串 abcdef// 使用一個參數str str.slice(2);//截取第二個之后所有的字符 cdefstr str.substring(2);//截取第二個之后所有的…

網絡工程師需要哪些知識_成長工程師可以教給我們哪些工程知識

網絡工程師需要哪些知識I’ve been working as an engineer on the growth team at Airbnb for a couple of months now.我已經在Airbnb的成長團隊擔任工程師幾個月了。 Since I’m in an environment full of passionate developers, I wanted to share some of the good eng…