1. 程式人生 > >cas框架配置詳解

cas框架配置詳解



一、概述

單點登入(Single Sign On , 簡稱 SSO )是目前比較流行的服務於企業業務整合的解決方案之一, SSO 使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。CAS(Central Authentication Service)是一款不錯的針對 Web 應用的單點登入框架,本文介紹了 CAS 的原理、協議、在 Tomcat 中的配置和使用,對於採用 CAS 實現輕量級單點登入解決方案的入門讀者具有一定指導作用。

二、CAS介紹

CAS 是 Yale 大學發起的一個開源專案,旨在為 Web 應用系統提供一種可靠的單點登入方法,CAS 在 2004 年 12 月正式成為 JA-SIG 的一個專案(http://www.jasig.org)。CAS 具有以下特點:

1)開源的企業級單點登入解決方案

2)CAS Server 為需要獨立部署的 Web 應用

3)CAS Client 支援非常多的客戶端(指Web 應用),包括Java,.Net,PHP,Perl,Ruby 等

三、CAS原理及協議

從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 需要獨立部署,主要負責對使用者的認證工作;CAS Client 負責處理對客戶端受保護資源的訪問請求,需要登入時,重定向到 CAS Server。AS 最基本的協議過程:

CAS Client 與受保護的客戶端應用部署在一起,以 Filter 方式保護受保護的資源。對於訪問受保護資源的每個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,如果沒有,則說明當前使用者尚未登入,於是將請求重定向到指定好的 CAS Server 登入地址,並傳遞 Service (也就是要訪問的目的資源地址),以便登入成功過後轉回該地址。使用者在第 3 步中輸入認證資訊,如果登入成功,CAS Server 隨機產生一個相當長度、唯一、不可偽造的 Service Ticket,並快取以待將來驗證,之後系統自動重定向到 Service 所在地址,併為客戶端瀏覽器設定一個 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產生的 Ticket 過後,在第 5,6 步中與 CAS Server 進行身份合適,以確保 Service Ticket 的合法性。

在該協議中,所有與 CAS 的互動均採用 SSL 協議,確保,ST 和 TGC 的安全性。協議工作過程中會有 2 次重定向的過程,但是 CAS Client 與 CAS Server 之間進行 Ticket 驗證的過程對於使用者是透明的。

另外,CAS 協議中還提供了 Proxy (代理)模式,以適應更加高階、複雜的應用場景,具體介紹可以參考 CAS 官方網站上的相關文件。

四、CAS SERVER配置

1.準備工作

安裝配置JDK、安裝Tomcat7,此處不做詳解。

到CAS官網下載CAS Server和Client,地址如下:

http://downloads.jasig.org/cas/cas-server-4.0.0-release.zip

http://downloads.jasig.org/cas-clients/cas-client-3.2.1-release.zip

2.部署

1.將下載的cas-server-4.0.0-release.zip解開,把cas-server-4.0.0/modules/cas-server-webapp-4.0.0.war拷貝到 tomcat的webapps目錄,並更名為cas.war。

2.修改cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml檔案,將屬性p:cookieSecure="true" 變成 p:cookieSecure="false"(這個設定主要是讓CAS不走SSL協議,詳見:讓CAS不用SSL也可實現跨域)

3.啟動tomcat,然後訪問:http://localhost:8888/cas,如果能出現正常的CAS登入頁面,則說明CAS Server 已經部署成功。如下圖:

雖然 CAS Server 已經部署成功,但這只是一個預設的實現,在實際使用的時候,還需要根據實際概況做擴充套件和定製,最主要的是擴充套件認證 (Authentication) 介面和 CAS Server 的介面。

五、CAS Client配置

將下載的cas-client-3.2.1-release.zip解開,將cas-client-3.2.1/modules/

cas-client-core-3.2.1.jar,放入你的web專案lib目錄中,修改web.xml,新增如下web.xml中單點登入塊配置資訊:

Xml程式碼 複製程式碼 收藏程式碼
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <web-appxmlns: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.     id="WebApp_ID"version="2.5">
  6.     <display-name>CasClientOne</display-name>
  7.     <welcome-file-list>
  8.         <welcome-file>index.html</welcome-file>
  9.         <welcome-file>index.htm</welcome-file>
  10.         <welcome-file>index.jsp</welcome-file>
  11.         <welcome-file>default.html</welcome-file>
  12.         <welcome-file>default.htm</welcome-file>
  13.         <welcome-file>default.jsp</welcome-file>
  14.     </welcome-file-list>
  15.     <!-- ======================== 單點登入結束 ======================== -->
  16.     <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置 -->
  17.     <listener>
  18.         <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
  19.     </listener>
  20.     <!-- 該過濾器用於實現單點登出功能,可選配置。 -->
  21.     <filter>
  22.         <filter-name>CAS Single Sign Out Filter</filter-name>
  23.         <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
  24.     </filter>
  25.     <filter-mapping>
  26.         <filter-name>CAS Single Sign Out Filter</filter-name>
  27.         <url-pattern>/*</url-pattern>
  28.     </filter-mapping>
  29.     <!-- 該過濾器負責使用者的認證工作,必須啟用它 -->
  30.     <filter>
  31.         <filter-name>CASFilter</filter-name>
  32.         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
  33.         <init-param>
  34.             <param-name>casServerLoginUrl</param-name>
  35.             <param-value>http://localhost:8888/cas/login</param-value><!-- cas 伺服器登入 地址  http://IP:PORT/CasWebProName/login -->
  36.         </init-param>
  37.         <init-param>
  38.             <!-- 這裡的server是服務端的IP -->
  39.             <param-name>serverName</param-name>
  40.             <param-value>http://localhost:8080</param-value><!-- 客戶端伺服器地址   http://IP:PORT -->
  41.         </init-param>
  42.     </filter>
  43.     <filter-mapping>
  44.         <filter-name>CASFilter</filter-name>
  45.         <url-pattern>/*</url-pattern>
  46.     </filter-mapping>
  47.     <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->
  48.     <filter>
  49.         <filter-name>CAS Validation Filter</filter-name>
  50.         <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
  51.         <init-param>
  52.             <param-name>casServerUrlPrefix</param-name>
  53.             <param-value>http://localhost:8888/cas</param-value><!-- cas 伺服器地址  http://IP:PORT/CasWebProName -->
  54.         </init-param>
  55.         <init-param>
  56.             <param-name>serverName</param-name>
  57.             <param-value>http://localhost:8080</param-value><!-- 客戶端伺服器地址   http://IP:PORT -->
  58.         </init-param>
  59.     </filter>
  60.     <filter-mapping>
  61.         <filter-name>CAS Validation Filter</filter-name>
  62.         <url-pattern>/*</url-pattern>
  63.     </filter-mapping>
  64.     <!-- 該過濾器負責實現HttpServletRequest請求的包裹, 比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。 -->
  65.     <filter>
  66.         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  67.         <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
  68.     </filter>
  69.     <filter-mapping>
  70.         <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
  71.         <url-pattern>/*</url-pattern>
  72.     </filter-mapping>
  73.     <!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
  74.     <filter>
  75.         <filter-name>CAS Assertion Thread Local Filter</filter-name>
  76.         <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
  77.     </filter>
  78.     <filter-mapping>
  79.         <filter-name>CAS Assertion Thread Local Filter</filter-name>
  80.         <url-pattern>/*</url-pattern>
  81.     </filter-mapping>
  82.     <!-- ======================== 單點登入結束 ======================== -->
  83. </web-app>

配置完畢後,啟動tomcat,然後訪問:http://IP:PORT/WebProName/index.jsp,如果系統跳轉到CAS登入頁面,輸入使用者名稱/密碼(正確的)後,會跳轉到http://IP:PORT/WebProName/index.jsp,則說明CAS Client已經部署成功。

注:到此CAS框架已搭建完畢,此種方法未採用SSL協議(需要修改Cas),如果想採用SSL協議方式,則在上述配置中需要以下調整:

  • 修改Cas Server所處Web容器(本文為Tomcat),使其支援SSL協議
  • Cas Server部署時,不需要修改cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xm
  • Cas Client  web.xml中配置的Cas Server相關地址需要將http變更成https

六、JDBC認證方式

1.相關JAR包準備 

cas-server-4.0.0-release.zip\cas-server-4.0.0\modules\cas-server-support-jdbc-4.0.0.jar及相應的資料庫驅動包(這裡是MySQL驅動mysql-connector-java-5.1.7-bin.jar)複製到cas/WEB-INF/lib目錄下。

2.修改deployerConfigContext.xml1. 

       <!-- 註釋掉原本固定登入使用者 -->

<!--     <bean id="primaryAuthenticationHandler" -->

<!--           class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler"> -->

<!--         <property name="users"> -->

<!--             <map> -->

<!--                 <entry key="casuser" value="Mellon"/> -->

<!--             </map> -->

<!--         </property> -->

<!--     </bean> -->

<!-- 變更為JDBC驗證方式 -->

    <bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

    <property name="dataSource" ref="dataSource"></property>

    <property name="sql" value="select password from user where user_name=?"></property>

    <property name="passwordEncoder" ref="MD5PasswordEncoder"></property>

    </bean>

<!-- 資料來源配置 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>

<property name="url"><value>jdbc:mysql://localhost:3309/ossm?characterEncoding=utf8</value></property>

<property name="username"><value>root</value></property>

<property name="password"><value>root</value></property> 

</bean> 

<!-- 新增MD5密碼加密功能 -->

<bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">

<constructor-arg index="0">

<value>MD5</value>

</constructor-arg> 

</bean> 

七、客戶端獲取使用者登入資訊

CAS登入成功預設返回的只有使用者名稱,

JAVA客戶端獲取:

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); 

String username = principal.getName(); 

而在實際應用中,客戶端需要知道更多的使用者資訊,比如使用者的性別,年齡,愛好,地址,使用者的分組,角色資訊等等,下面介紹如何給客戶端返回更多的使用者資料和資訊:

1.修改cas/WEB-INF/deployerConfigContext.xml,註釋掉原有的attributeRepository及attributeRepository的引用資訊,新增如下資訊:

<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao">

        <constructor-arg index="0" ref="dataSource"/>

        <constructor-arg index="1" value="select * from user where {0}"/> 

<!--         <constructor-arg index="1" value="select * from user where {0} {1}"/> -->

        <!-- 組裝sql用的查詢條件屬性 -->

        <property name="queryAttributeMapping">

            <map>

                <!-- 這裡的key需寫username,value對應資料庫使用者名稱欄位 -->

                <entry key="username" value="user_name"/>

                <!-- <entry key="id" value="id"/> -->

            </map>

        </property>

        <!-- 如果要組裝多個查詢條件,需要加上下面這個,預設為AND -->  

        <property name="queryType">

         <value>OR</value>

        </property>  

        <!-- 要獲取的屬性在這裡配置 -->

        <property name="resultAttributeMapping">

            <map>

             <!--key為對應的資料庫欄位名稱,value為提供給客戶端獲取的屬性名字,系統會自動填充值-->

                <entry key="id" value="id"/>

                <entry key="user_name" value="username"/>

                <entry key="phone" value="phone"/>

                <entry key="email" value="email"/>

            </map>

        </property>

    </bean>

2.修改cas/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,新增下方標紅部分:1.

<cas:serviceResponsexmlns:cas='http://www.yale.edu/tp/cas'>

<cas:authenticationSuccess>

<cas:user>${fn:escapeXml(assertion.primaryAuthentication.principal.id)}</cas:user>

<%-- 返回更多使用者資訊配置  By Goma --%>

<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}">

            <cas:attributes>

                <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}">

                    <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>

                </c:forEach>

            </cas:attributes>

        </c:if>

<c:iftest="${not empty pgtIou}">

<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>

</c:if>

<c:iftest="${fn:length(assertion.chainedAuthentications) > 1}">

<cas:proxies>

<c:forEachvar="proxy"items="${assertion.chainedAuthentications}"varStatus="loopStatus"begin="0"end="${fn:length(assertion.chainedAuthentications)-2}"step="1">

<cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>

</c:forEach>

</cas:proxies>

</c:if>

</cas:authenticationSuccess>

</cas:serviceResponse>

3.客戶端取值3.

AttributePrincipal principal = (AttributePrincipal) request.getUserPrincipal(); 

String username = principal.getName(); 

Map<String,Object> attributes = principal.getAttributes();

String email = attributes .get("email") + "";

八、介面定製

CAS 提供了一套預設的頁面,在目錄cas/WEB-INF/view/jsp/default下。在部署 CAS 之前,我們可能需要定製一套新的CAS Server頁面,新增一些個性化的內容。最簡單的方法就是拷貝一份 default檔案到“ cas/WEB-INF/view/jsp ”目錄下,比如命名為newUI,接下來是實現和修改必要的頁面,有 4 個頁面是必須的:

casConfirmView.jsp: 當用戶選擇了“warn”時會看到的確認介面

casGenericSuccess.jsp: 在使用者成功通過認證而沒有目的Service時會看到的介面

casLoginView.jsp: 當需要使用者提供認證資訊時會出現的介面

casLogoutView.jsp: 當用戶結束 CAS 單點登入系統會話時出現的介面

CAS 的頁面採用 Spring框架編寫,對於不熟悉 Spring 的使用者,在修改之前需要熟悉該框架。

頁面定製完過後,還需要做一些配置從而讓 CAS 找到新的頁面,拷貝cas/WEB-INF/classes/default_views.properties,重新命名為as/WEB-INF/classes/ newUI_views.properties,並修改其中所有的值到相應新頁面。最後是更新cas/WEB-INF/cas.properties檔案中的 cas.viewResolver.basename,將default_views更改為newUI_views。

九、其他功能擴充套件

增加驗證碼、密碼有效期、限制使用者登入之類的功能這裡不做描述,如果需要請自行查詢。

相關推薦

cas框架配置

 一、概述 單點登入(Single Sign On , 簡稱 SSO )是目前比較流行的服務於企業業務整合的解決方案之一, SSO 使得在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。CAS(Central Authentication Serv

Struts框架配置

Struts是一個非常優秀的MVC框架,是應用最廣泛的 Java Web 應用開發框架。     基於Struts開發的應用有3類元件構成:控制器元件、模型元件和檢視元件。控制器元件包括 ActionServlet (Struts的核心控制器)  還包括自定義的Act

struts2框架學習筆記2:配置

true class 規範 開發規範 刪除用戶 建議 類名 esp 需要 核心配置文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Soft

SpringMVC 框架系列之組件概述與配置

align 概述 handle ont htm 配置文件 掃描器 springmvc 解析 在上一篇文章 SpringMVC 框架系列之初識與入門實例 的實例中,我們已經知道,SpringMVC 框架是一個 web 層的框架,本篇文章就詳細解釋一下 SpringMVC 框架

SSM框架整合配置(spring,spring mvc,mybatis)

當今SSM框架已經成為了一種主流,其中spring,spring mvc和mybatis框架的功能很強大,給我們程式設計師節省了很多力氣,可以說這三種框架簡直就是我們程式設計師的福音,但是我們都知道,框架在自身帶來便捷的同時,也存在很多的配置檔案,更別說當三個框架整合的時候那就更加的困難了,

Spring-Security整合CAS之Spring-Security.xml部分配置

<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://w

SSM框架配合Maven時,pom.xml配置

這篇部落格針對我這樣的小白。 一. pom.xml有什麼用?:  我們知道maven(什麼是maven請移步https://www.cnblogs.com/whgk/p/7112560.html) 可以給我們管理jar包和其他資源(jar包:別人寫好的輪子,我們負責呼叫)

spring框架中web.xml的配置

1 定義頭和根元素   部署描述符檔案就像所有XML檔案一樣,必須以一個XML頭開始。這個頭宣告可以使用的XML版本並給出檔案的字元編碼。 DOCYTPE宣告必須立即出現在此頭之後。這個宣告告訴伺服器適用的servlet規範的版本(如2.2或2.3)並指定管理此檔案其餘部

JavaWeb配置(結合框架SpringMVC)

詳解 先說一說常識性的東西,我們的JavaWeb程式執行一開始走的是web.xml檔案,這是我們的核心檔案,可以說沒有web.xml檔案我們就無法執行專案,這個檔案長什麼樣子,讀者自己新建一個web專案就行了。 web.xml <displa

Spring4.X + Spring MVC + Mybatis3 零配置應用開發框架搭建 (3)

Spring4.X + Spring MVC + Mybatis3 零配置應用開發框架搭建詳解(3) - 實現最基本的登入處理 1. 基本架構:         基礎框架搭建完成後,我們開始進行Spring + SpringMVC + Mybatis的整合,來完成登入功能的

ssm框架中,專案啟動過程以及web.xml配置

本篇主要在基於SSM的框架,深入講解web.xml的配置 web.xml        每個javaEE專案中都會有,web.xml檔案是用來初始化配置資訊:比如Welcome頁面、servlet、servlet-mapping、filter、listener、啟動載入級

Spring+mybatis+struts框架整合的配置

學了很久的spring+mybatis+struts.一直都是單個的用他們,或者是兩兩組合用過,今天總算整合到一起了,配置起來有點麻煩,但是配置完一次之後,就輕鬆多了,那麼框架整合配置詳解如下。 1、匯入相應的jar包 因為我們建造的是maven的web專案,所有我們在pom.xml中需要匯入這些包。

《Java Spring框架》Spring切面(AOP)配置

1.  Spring 基本概念 AOP(Aspect Oriented Programming)稱為面向切面程式設計,在程式開發中主要用來解決一些系統層面上的問題,比如日誌,事務,許可權等待,Struts2的攔截器設計就是基於AOP的思想,是個比較經典的例子。 在不改變原有的邏輯的基礎

setting.xml 配置

校驗 找不到 順序 裁剪 全局 -- mls leg 觸發 文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用戶配置: ${user.home}/.m2/settings.xml note:用戶配置優先於全局配置。${user.home}

【Spring】Spring MVC原理及配置

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡

kafka參數配置

kafka 參數 broker.idbroker的唯一標識符,如果不配置則自動生成,建議配置且一定要保證集群中必須唯一,默認-1log.dir日誌數據存放的目錄,默認/tmp/kafka-logslog.dirs日誌數據存放的目錄,如果沒有配置則使用log.dir,建議此項配置。zookeeper.c

Lnux系統網卡綁定配置

ole osd 接口 當前 onf prim multi pac lin 一、CentOS 配置網卡綁定(bonding) 1、bonding概述 (1)作用:就是將多塊網卡綁定同一IP地址對外提供服務,可以實現高可用或者負載均衡。當然,直接給兩塊網卡設置同一IP地址是不可

Nginx配置

set 文件結構 時也 解決方案 ces 反向代理服務器 use 力量 第三方模塊 最近在搞nginx和tomcat 以及apache的集群。下面是參考的一片很不錯的關於nginx配置的詳細講解: http://www.cnblogs.com/knowledgesea/p/

Apache配置

搜索 相對 第一個 form 執行權限 php 時有 多個 direct Apache的配置由httpd.conf文件配置,因此下面的配置指令都是在httpd.conf文件中修改。 主站點的配置(基本配置) (1) 基本配置: ServerRoot "/mnt/softwa

緩存varnish的管理及配置

啟動 一個 hint 單位 quad spec int rom try 一 工作原理 在當前主流的Web服務架構體系中,Cache擔任著越來越重要的作用。常見的基於瀏覽器的C/S架構,Web Cache更是節約服務器資源的關鍵。而最近幾年由FreeBSD創始人之一Kamp開