【Tech】單點登陸系統CAS客戶端demo

服務器端配置請參考: http://www.cnblogs.com/sunshineatnoon/p/4064632.htmlhtml

工具:myeclipse或者javaee-eclipsejava

1.啓動javaee-eclipse,我啓動的時候遇到了java was started but returned exit code=1的錯誤,搜了一下解決的方法大概有兩類:mysql

  (1)eclipse目錄不能有中文(我就是這個問題)web

  (2)修改eclipse目錄下的eclipse.ini文件,在-vmargs這一行前面加上兩行,一行是-vm,令一行是javaw.exe的路徑,就像這樣:sql

-vm
E:\Program Files\Java\jdk1.7.0\bin\javaw.exe

大多數狀況下基本就沒問題了,還有人是由於java內存分配不足引發的,網上有答案,這裏就不提了。數據庫

2.eclipse中新建File->New->Other->Web->Dynamic Web Project,建立一個名叫CasClient的web工程,注意新建的時候要把Generate web.xml deployment descriptor勾選上,不然後面要手動添加web.xml文件。apache

3.把\cas-client-3.2.1\modules下的全部jar包拷貝到j2eeeclipseWorkSpace\CasClient\WebContent\WEB-INF\lib下。瀏覽器

4.把web.xml文件替換成以下的文件:tomcat

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 3   <display-name>casclient1</display-name>
 4   
 5   <!-- 用於單點退出,該監聽器用於實現單點登出功能,通知其餘應用單點登出 -->
 6   <listener>
 7       <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
 8   </listener>
 9   
10   <!-- 該過濾器用於實現單點登出功能 -->
11   <filter>
12       <filter-name>CAS Single Sign Out Filter</filter-name>
13       <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
14   </filter>
15   <filter-mapping>
16       <filter-name>CAS Single Sign Out Filter</filter-name>
17       <url-pattern>/*</url-pattern>
18   </filter-mapping>
19    
20   <!-- 該過濾器負責用戶的認證工做 -->
21   <filter>
22       <filter-name>CASFilter</filter-name>
23       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
24       <init-param>
25           <param-name>casServerLoginUrl</param-name>
26                 <!-- 設置登陸的URL地址 -->
27           <param-value>https://localhost:8443/cas/login</param-value>
28       </init-param>
29       <init-param>
30           <param-name>serverName</param-name>
31                 <!-- 設置本應用的訪問地址及端口 -->
32           <param-value>http://localhost:8080</param-value>
33       </init-param>
34   </filter>
35   <filter-mapping>
36       <filter-name>CASFilter</filter-name>
37       <url-pattern>/*</url-pattern>
38   </filter-mapping>
39   
40   <!-- 該過濾器負責對Ticket的校驗 -->
41   <filter>
42       <filter-name>CAS Validation Filter</filter-name>
43       <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
44       <init-param>
45           <param-name>casServerUrlPrefix</param-name>
46           <param-value>https://localhost:8443/cas</param-value>
47       </init-param>
48       <init-param>
49           <param-name>serverName</param-name>
50           <param-value>http://localhost:8080</param-value>
51       </init-param>
52   </filter>
53   <filter-mapping>
54       <filter-name>CAS Validation Filter</filter-name>
55       <url-pattern>/*</url-pattern>
56   </filter-mapping>
57   
58   <!-- 該過濾器負責實現HttpServletRequest請求的包裹,容許開發者經過HttpServletRequest的getRemoteUser()獲取SSO登陸的用戶 -->
59   <filter>
60       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
61       <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
62   </filter>
63   <filter-mapping>
64       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
65       <url-pattern>/*</url-pattern>
66   </filter-mapping>
67   
68    <!-- 該過濾器使得開發者能夠經過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登陸名。 好比AssertionHolder.getAssertion().getPrincipal().getName()。 -->
69   <filter>
70       <filter-name>CAS Assertion Thread Local Filter</filter-name>
71     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
72   </filter>
73   <filter-mapping>
74     <filter-name>CAS Assertion Thread Local Filter</filter-name>
75     <url-pattern>/*</url-pattern>
76   </filter-mapping>
77   
78   <welcome-file-list>
79     <welcome-file>index.jsp</welcome-file>
80   </welcome-file-list>
81 </web-app>

5.在j2eeeclipseWorkSpace\CasClient\WebContent\目錄下新建index.jsp文件服務器

 1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
 2 <%@ page import="org.jasig.cas.client.authentication.AttributePrincipal" %>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5     <head>
 6         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 7         <title>casClient1</title>
 8     </head>
 9     <body>
10         <% 
11             //AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
12             //String userName = principal.getName();
13         %>
14         <br />--------------------------------------------<br />
15         <h1>登陸成功,CAS客戶端1。</h1><br />
16         <!-- <h2>當前登陸用戶:</h2><br /> -->
17         <a href="http://localhost:8080/CasClient2/index.jsp">進入客戶端2</a><br />
18         <a href="https://localhost:8443/cas/logout">退出</a><br />
19     </body>
20 </html>

6.在\apache-tomcat-7.0.56\webapps\下新建一個文件夾叫CasClient文件夾,而後把\j2eeeclipseWorkSpace\Cas Client\WebContent\下的兩個文件夾META-INF和WEB-INF,還有index.jsp文件拷貝到剛纔建立的CasClient文件夾下.

7.爲了驗證單點登陸,用上述6步方法再建立一個CasClient2工程,也把它相應的文件拷貝到\apache-tomcat-7.0.56\webapps\CasClient下,注意CasClient2中index.jsp須要作的修改,上述15行改成:

<h1>登陸成功,CAS客戶端2。</h1><br />

17行改成:

 <a href="http://localhost:8080/CasClient/index.jsp">進入客戶端1</a><br />

這樣就能夠從CasClient2跳轉到CasClient界面。

8.驗證單點登陸系統:瀏覽器打開頁面http://localhost:8080/CasClient,這是會跳轉到cas的登陸頁面,以下圖:

注意到紅色部分能夠幫助咱們理解CAS的工做原理,當用戶訪問cas client對應的資源時,被重定向到cas server而且將用戶想要訪問的資源用GET的方式添加在url尾部(上述紅框)發送給server,方便在登陸成功後直接跳轉到相應的資源。

而後咱們用數據庫中的用戶名密碼登陸(與mysql的對接詳情參見cas server配置,連接在博文最上方),登陸成功後的頁面以下:

而後咱們能夠直接點擊「進入客戶端2」跳轉到CasClient2,或者直接在瀏覽器裏面輸入http://localhost:8080/CasClient2跳轉到CasClient2頁面,以下圖所示:

能夠看到從CAS客戶端1進入到CAS客戶端2徹底不須要從新登陸,從CAS客戶端2再次跳轉回到CAS客戶端1頁不須要從新登陸,即實現了單點登陸。

在上述的過程當中,我還解決了三個bug:

1.一個是提示java.security.cert.CertificateException: No name matching localhost found,解決的方法參考http://www.cnblogs.com/dycg/archive/2013/04/04/2999012.html,即從新生成一邊證書(詳情參見cas server配置),在回答名字和姓氏的時候,確保回答的是localhost(或者你的域名)。

2.這時用新生成的證書替換原來的證書,又報錯SunCertPathBuilderException: Unable To Find Valid Certification Path To Requested Target,這個的緣由和解決方法這裏http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/解釋的很清楚了,主要是服務端的證書沒有被認證,從上述網址中總結的解決方法以下:

  (1)下載InstallCert.java(國外網站上大神寫的解決這個問題的java文件,我把它down下來放在本身的網盤上了,大神網頁參見參考資料[4])。

  (2)cd到InstallCert.java所在目錄下編譯運行InstallCert.java:

  而後根據提示選擇相應的證書(應該是輸入1),就會在InstallCert.java所在的目錄下生成一個jssecacerts文件。

  (3)拷貝上述生成的jssecacerts文件到$JAVA_HOME\jre\lib\security目錄下。

  (4)從新打開網頁,就沒有問題了。

3.部署CasClient的時候,tomcat出現錯誤:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter

   解決方法是在\apache-tomcat-7.0.57\conf\context.xml的<Context></Context>兩個標籤以前插入<Loader delegate="true" />;[5]

參考資料:

[1]http://bh-keven.iteye.com/blog/1317793

[2]http://www.cnblogs.com/dycg/archive/2013/04/04/2999012.html

[3]http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/

[4]https://blogs.oracle.com/gc/entry/unable_to_find_valid_certification

[5]http://nvry.iteye.com/blog/1726163

相關文章
相關標籤/搜索