日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)

發(fā)布時(shí)間:2023/11/30 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近一直在研究cas登錄中心這一塊的應(yīng)用,分享一下記錄的一些筆記和心得。后面會(huì)把cas-server端的配置和重構(gòu),另外還有這幾天再搞nginx+cas的https反向代理配置,以及cas的證書(shū)相關(guān)的知識(shí)分享出來(lái)。

Cas由兩部分組成,Cas Server和Cas Client。Cas Server是Cas自己的服務(wù)端,而Cas Client是Cas客戶(hù)端,往往客戶(hù)端需要和我們具體的業(yè)務(wù)系統(tǒng)進(jìn)行集成,這里我們主要詳述cas 客戶(hù)端的配置以及實(shí)例

第一步:

我們得有一個(gè)現(xiàn)成的web項(xiàng)目,然后我們要加入cas-client-core-xxx.jar到classpath;

maven項(xiàng)目用這個(gè):

<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,順便推薦一個(gè)用來(lái)搜索和下載引用包的網(wǎng)站,我一般從這里下載引用包:http://mvnrepository.com/artifact/org.jasig.cas.client/cas-client-core/3.3.3


第二步:配置單點(diǎn)登錄Filter和注銷(xiāo)監(jiān)聽(tīng)器/過(guò)濾器

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

1.1、?配置AuthenticationFilter

?1.1.1、AuthenticationFilter有兩個(gè)必須指定的參數(shù):

casServerLoginUrl用來(lái)指定Cas Server登錄地址serverName或service用來(lái)指定認(rèn)證成功后需要跳轉(zhuǎn)地址。

補(bǔ)充:

service和serverName一般只需要指定一個(gè),如果都指定了,參數(shù)service將具有更高的優(yōu)先級(jí),即以service指定的參數(shù)值為準(zhǔn)。

service和serverName的區(qū)別:

service指定的是一個(gè)確定的URL,認(rèn)證成功后就會(huì)確切的跳轉(zhuǎn)到service指定的URL;

serverName用來(lái)指定主機(jī)名,格式為{http/https}:{主機(jī)名}:{端口號(hào)}

如:https://localhost:8335,當(dāng)指定的是serverName時(shí),AuthenticationFilter將會(huì)把它附加上當(dāng)前請(qǐng)求的URI,以及對(duì)應(yīng)的查詢(xún)參數(shù)來(lái)構(gòu)造一個(gè)確定的URL,如指定serverName為“http://localhost”,而當(dāng)前請(qǐng)求的URI為“/login”,查詢(xún)參數(shù)為“user=123&pwd=123”,則對(duì)應(yīng)認(rèn)證成功后的跳轉(zhuǎn)地址將為“http://localhost/login?user=123&pwd=123”。)

?AuthenticationFilter可以指定如下可選參數(shù):
renew:當(dāng)指定renew為true時(shí),在請(qǐng)Cas Server時(shí)將帶上參數(shù)“renew=true”,默認(rèn)為false。
gateway:指定gateway為true時(shí),在請(qǐng)求Cas Server時(shí)將帶上參數(shù)“gateway=true”,默認(rèn)為false。
artifactParameterName:指定ticket對(duì)應(yīng)的請(qǐng)求參數(shù)名稱(chēng),默認(rèn)為ticket。
serviceParameterName:指定service對(duì)應(yīng)的請(qǐng)求參數(shù)名稱(chēng),默認(rèn)為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

請(qǐng)求通過(guò)AuthenticationFilter的認(rèn)證之后,如果請(qǐng)求中攜帶了參數(shù)ticket則將會(huì)由TicketValidationFilter來(lái)對(duì)攜帶的ticket進(jìn)行校驗(yàn)。

TicketValidationFilter只是對(duì)驗(yàn)證ticket的這一類(lèi)Filter的統(tǒng)稱(chēng),其并不對(duì)應(yīng)Cas Client中的一個(gè)具體類(lèi)型。

Cas Client中有多種驗(yàn)證ticket的Filter,都繼承自AbstractTicketValidationFilter,它們的驗(yàn)證邏輯都是一致的,都有AbstractTicketValidationFilter實(shí)現(xiàn),不同的是使用的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>
必須指定的參數(shù):

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

??

可選參數(shù):
redirectAfterValidation :表示是否驗(yàn)證通過(guò)后重新跳轉(zhuǎn)到該URL,但是不帶參數(shù)ticket,默認(rèn)為true。
useSession : ? ? ? ? ? ? ? ?在驗(yàn)證ticket成功后會(huì)生成一個(gè)Assertion對(duì)象,如果useSession為true,則會(huì)將該對(duì)象存放到Session中。如果為false,則要求每次請(qǐng)求都需要攜帶ticket進(jìn)行驗(yàn)證,顯然useSession為false跟redirectAfterValidation為true是沖突的。默認(rèn)為true。
exceptionOnValidationFailure :表示ticket驗(yàn)證失敗后是否需要拋出異常,默認(rèn)為true。
renew: ? ? ? ? ? ? ? ? ? ? ? ? 當(dāng)值為true時(shí)將發(fā)送“renew=true”到Cas Server,默認(rèn)為false。
?
1.3、配置HttpServletRequestWrapperFilter

?HttpServletRequestWrapperFilter用于將每一個(gè)請(qǐng)求對(duì)應(yīng)的HttpServletRequest封裝為其內(nèi)部定義的CasHttpServletRequestWrapper,該封裝類(lèi)將利用之前保存在Session或request中的Assertion對(duì)象重寫(xiě)HttpServletRequest的getUserPrincipal()、getRemoteUser()和isUserInRole()方法。這樣在我們的應(yīng)用中就可以非常方便的從HttpServletRequest中獲取到用戶(hù)的相關(guān)信息。

<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可以在應(yīng)用的其它地方獲取Assertion對(duì)象,找個(gè)過(guò)濾器會(huì)把Assertion對(duì)象存放到當(dāng)前的線(xiàn)程變量中,我們?cè)诔绦虻娜魏蔚胤蕉伎梢詮木€(xiàn)程變量中獲取當(dāng)前Assertion,就不需要再?gòu)腟ession或request中進(jìn)行解析了。這個(gè)線(xiàn)程變量是由AssertionHolder持有的,我們?cè)讷@取當(dāng)前的Assertion時(shí)也只需要通過(guò)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、配置單點(diǎn)注銷(xiāo)監(jiān)聽(tīng)器和過(guò)濾器用于統(tǒng)一注銷(xiāo)

<!-- 單點(diǎn)注銷(xiāo)監(jiān)聽(tīng)器 --> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!-- 單點(diǎn)注銷(xiāo)過(guò)濾器 --> <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>


當(dāng)你真的登錄成功后,你會(huì)發(fā)現(xiàn),你回不到原來(lái)頁(yè)面了!怎么辦?其實(shí)我們只要在前端給他一個(gè)參數(shù)就行了,可以這樣簡(jiǎn)單實(shí)現(xiàn)這個(gè)功能:

//登錄中心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(); } //登錄中心執(zhí)行登出操作 function logoutServ() {alert("開(kāi)始登出");var loginUrl = loginCenter + "/login?service=" + getUrl();location.href = loginCenter + "/logout?service=" + loginUrl; }在頁(yè)面上的你得有登錄和退出兩個(gè)按鈕,分別調(diào)用login()和logoutServ()方法。

其實(shí)這里還有個(gè)小問(wèn)題,就是雖然你在cas-server端注銷(xiāo)了,你會(huì)發(fā)現(xiàn)它依然會(huì)認(rèn)為你現(xiàn)在是登錄狀態(tài),所以沒(méi)有攔截你的請(qǐng)求。

這是因?yàn)樗鼤r(shí)基于session驗(yàn)證的,你的server端session已經(jīng)注銷(xiāo)了,但是客戶(hù)端應(yīng)用這里的session還沒(méi)有注銷(xiāo)

一般我們會(huì)使用共享session的方法解決這個(gè)問(wèn)題,另外有個(gè)簡(jiǎn)單的方法就是你可以在后臺(tái)寫(xiě)個(gè)用來(lái)注銷(xiāo)當(dāng)前用戶(hù)session的接口。




轉(zhuǎn)載于:https://www.cnblogs.com/eguid/p/10195648.html

總結(jié)

以上是生活随笔為你收集整理的cas单点登录系统:客户端(client)详细配置(包含统一单点注销配置)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。