CAS-開源單點登陸系統-實踐
一、CAS入門
1、什麼是單點登陸?
單點登入(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。
我們目前的系統存在諸多子系統,而這些子系統是分別部署在不同的伺服器中,那麼使用傳統方式的session是無法解決的,我們需要使用相關的單點登入技術來解決。
2、什麼是cas?
CAS 是 Yale 大學發起的一個開源專案,旨在為 Web 應用系統提供一種可靠的單點登入方法,CAS 在 2004 年 12 月正式成為 JA-SIG 的一個專案。CAS 具有以下特點:
【1】開源的企業級單點登入解決方案。
【2】CAS Server 為需要獨立部署的 Web 應用。
【3】CAS Client 支援非常多的客戶端(這裡指單點登入系統中的各個 Web 應用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
SSO單點登入訪問流程主要有以下步驟:
1. 訪問服務:SSO客戶端傳送請求訪問應用系統提供的服務資源。
2. 定向認證:SSO客戶端會重定向使用者請求到SSO伺服器。
3. 使用者認證:使用者身份認證。
4. 發放票據:SSO伺服器會產生一個隨機的Service Ticket。
5. 驗證票據:SSO伺服器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務。
6. 傳輸使用者資訊:SSO伺服器驗證票據通過後,傳輸使用者認證結果資訊給客戶端。
3、CAS伺服器的部署
cas資源地址:https://github.com/apereo/cas
cas的伺服器其實就是一個war包。
在cas-server-4.0.0-release\cas-server-4.0.0\modules目錄下cas-server-webapp-4.0.0.war 將其改名為cas.war放入tomcat目錄下的webapps下。
啟動tomcat自動解壓war包。瀏覽器輸入http://localhost:8080/cas/login ,可看到登入頁面
完成將cas伺服器部署到tomcat上
這裡有個固定的使用者名稱和密碼 casuser /Mellon
登入成功後會跳到登入成功的提示頁面
4、cas服務端的相關配置
1)可以修改tomcat的埠
開啟tomcat 目錄 conf\server.xml 找到下面的配置
這裡修改成 9100
2) 修改CAS配置檔案
修改cas的WEB-INF/cas.properties
server.name=http://localhost:9100
3)去除https認證
CAS預設使用的是HTTPS協議,如果使用HTTPS協議需要SSL安全證書(需向特定的機構申請和購買) 。如果對安全要求不高或是在開發測試階段,可使用HTTP協議。我們這裡講解通過修改配置,讓CAS使用HTTP協議。
1 修改cas的WEB-INF/deployerConfigContext.xml
找到下面的配置
<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>
這裡需要增加引數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" />
引數p:cookieSecure="true",同理為HTTPS驗證相關,TRUE為採用HTTPS驗證,FALSE為不採用https驗證。
引數p:cookieMaxAge="-1",是COOKIE的最大生命週期,-1為無生命週期,即只在當前開啟的視窗有效,關閉或重新開啟其它視窗,仍會要求驗證。可以根據需要修改為大於0的數字,比如3600等,意思是在3600秒內,開啟任意視窗,都不需要驗證。
我們這裡將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
二、入門Demo
搭建一個簡單的Demo,專案目錄如下:一個Maven管理的Jar專案
專案pom.xml配置:
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>cn.itcast.demo</groupId> 4 <artifactId>casclient_demo1</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <packaging>war</packaging> 7 8 <dependencies> 9 <!-- cas --> 10 <dependency> 11 <groupId>org.jasig.cas.client</groupId> 12 <artifactId>cas-client-core</artifactId> 13 <version>3.3.3</version> 14 </dependency> 15 16 <dependency> 17 <groupId>javax.servlet</groupId> 18 <artifactId>servlet-api</artifactId> 19 <version>2.5</version> 20 <scope>provided</scope> 21 </dependency> 22 </dependencies> 23 24 <build> 25 <plugins> 26 <plugin> 27 <groupId>org.apache.maven.plugins</groupId> 28 <artifactId>maven-compiler-plugin</artifactId> 29 <version>2.3.2</version> 30 <configuration> 31 <source>1.7</source> 32 <target>1.7</target> 33 </configuration> 34 </plugin> 35 <plugin> 36 <groupId>org.apache.tomcat.maven</groupId> 37 <artifactId>tomcat7-maven-plugin</artifactId> 38 <configuration> 39 <!-- 指定埠 --> 40 <port>9001</port> 41 <!-- 請求路徑 --> 42 <path>/</path> 43 </configuration> 44 </plugin> 45 </plugins> 46 </build> 47 48 49 </project>View Code
專案 web.xml 檔案配置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 5 version="2.5"> 6 7 <!-- ======================== 單點登入開始 ======================== --> 8 <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置 --> 9 <listener> 10 <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 11 </listener> 12 13 <!-- 該過濾器用於實現單點登出功能,可選配置。 --> 14 <filter> 15 <filter-name>CAS Single Sign Out Filter</filter-name> 16 <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> 17 </filter> 18 <filter-mapping> 19 <filter-name>CAS Single Sign Out Filter</filter-name> 20 <url-pattern>/*</url-pattern> 21 </filter-mapping> 22 23 <!-- 該過濾器負責使用者的認證工作,必須啟用它 --> 24 <filter> 25 <filter-name>CASFilter</filter-name> 26 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 27 <init-param> 28 <param-name>casServerLoginUrl</param-name> 29 <param-value>http://localhost:9100/cas/login</param-value> 30 <!--這裡的server是服務端的IP --> 31 </init-param> 32 <init-param> 33 <param-name>serverName</param-name> 34 <param-value>http://localhost:9001</param-value> 35 </init-param> 36 </filter> 37 <filter-mapping> 38 <filter-name>CASFilter</filter-name> 39 <url-pattern>/*</url-pattern> 40 </filter-mapping> 41 42 <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 --> 43 <filter> 44 <filter-name>CAS Validation Filter</filter-name> 45 <filter-class> 46 org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 47 <init-param> 48 <param-name>casServerUrlPrefix</param-name> 49 <param-value>http://localhost:9100/cas</param-value> 50 </init-param> 51 <init-param> 52 <param-name>serverName</param-name> 53 <param-value>http://localhost:9001</param-value> 54 </init-param> 55 </filter> 56 <filter-mapping> 57 <filter-name>CAS Validation Filter</filter-name> 58 <url-pattern>/*</url-pattern> 59 </filter-mapping> 60 61 <!-- 該過濾器負責實現HttpServletRequest請求的包裹, 比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。 --> 62 <filter> 63 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 64 <filter-class> 65 org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 66 </filter> 67 <filter-mapping> 68 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 69 <url-pattern>/*</url-pattern> 70 </filter-mapping> 71 72 <!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 --> 73 <filter> 74 <filter-name>CAS Assertion Thread Local Filter</filter-name> 75 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 76 </filter> 77 <filter-mapping> 78 <filter-name>CAS Assertion Thread Local Filter</filter-name> 79 <url-pattern>/*</url-pattern> 80 </filter-mapping> 81 82 <!-- ======================== 單點登入結束 ======================== --> 83 84 85 </web-app>View Code
專案index.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 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>cas client demo1</title> 8 </head> 9 <body> 10 歡迎你的登陸一 ! name:<%=request.getRemoteUser() %> 11 12 <a href="http://localhost:9100/cas/logout?service=http://www.baidu.com">退出登入</a> 13 </body> 14 </html>View Code
執行服務端tomcat,Demo專案後,通過瀏覽器訪問Demo專案後會跳轉到CAS服務端進行驗證,CAS有預設的使用者密碼,(casuser /Mellon)
三、Demo 進階
Mark