<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

    一、概述

    單點登錄(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 version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns
    ="http://java.sun.com/xml/ns/javaee"
        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">
        
    <display-name>CasClientOne</display-name>
        
    <welcome-file-list>
            
    <welcome-file>index.html</welcome-file>
            
    <welcome-file>index.htm</welcome-file>
            
    <welcome-file>index.jsp</welcome-file>
            
    <welcome-file>default.html</welcome-file>
            
    <welcome-file>default.htm</welcome-file>
            
    <welcome-file>default.jsp</welcome-file>
        
    </welcome-file-list>
        
        
    <!-- ======================== 單點登錄結束 ======================== -->
        
    <!-- 用于單點退出,該過濾器用于實現單點登出功能,可選配置 -->
        
    <listener>
            
    <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
        
    </listener>
        
        
    <!-- 該過濾器用于實現單點登出功能,可選配置。 -->
        
    <filter>
            
    <filter-name>CAS Single Sign Out Filter</filter-name>
            
    <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        
    </filter>

        
    <filter-mapping>
            
    <filter-name>CAS Single Sign Out Filter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>

        
    <!-- 該過濾器負責用戶的認證工作,必須啟用它 -->
        
    <filter>
            
    <filter-name>CASFilter</filter-name>
            
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
            
    <init-param>
                
    <param-name>casServerLoginUrl</param-name>
                
    <param-value>http://localhost:8888/cas/login</param-value><!-- cas 服務器登錄 地址  http://IP:PORT/CasWebProName/login -->
            
    </init-param>
            
    <init-param>
                
    <!-- 這里的server是服務端的IP -->
                
    <param-name>serverName</param-name>
                
    <param-value>http://localhost:8080</param-value><!-- 客戶端服務器地址   http://IP:PORT -->
            
    </init-param>
        
    </filter>

        
    <filter-mapping>
            
    <filter-name>CASFilter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
        
    <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->
        
    <filter>
            
    <filter-name>CAS Validation Filter</filter-name>
            
    <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
            
    <init-param>
                
    <param-name>casServerUrlPrefix</param-name>
                
    <param-value>http://localhost:8888/cas</param-value><!-- cas 服務器地址  http://IP:PORT/CasWebProName -->
            
    </init-param>
            
    <init-param>
                
    <param-name>serverName</param-name>
                
    <param-value>http://localhost:8080</param-value><!-- 客戶端服務器地址   http://IP:PORT -->
            
    </init-param>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>CAS Validation Filter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
        
    <!-- 該過濾器負責實現HttpServletRequest請求的包裹, 比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。 -->
        
    <filter>
            
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
            
    <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
        
    <!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
        
    <filter>
            
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
            
    <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
        
    </filter>
        
    <filter-mapping>
            
    <filter-name>CAS Assertion Thread Local Filter</filter-name>
            
    <url-pattern>/*</url-pattern>
        
    </filter-mapping>
        
    <!-- ======================== 單點登錄結束 ======================== -->
    </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:serviceResponse xmlns: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:if test="${not empty pgtIou}">

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

            </c:if>

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

      <cas:proxies>

                <c:forEach var="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-servlet.xml文件中的 viewResolver,將protocol_views更改為newUI_views。

     

    九、其他功能擴展

    增加驗證碼、密碼有效期、限制用戶登錄之類的功能這里不做描述,如果需要請自行查找。

     


    posted on 2016-06-08 10:03 rogerfan 閱讀(436) 評論(0)  編輯  收藏 所屬分類: 【開源技術】
    主站蜘蛛池模板: 一个人免费观看视频在线中文| 亚洲狠狠婷婷综合久久蜜芽| 鲁丝片一区二区三区免费 | 一色屋成人免费精品网站 | 国产无人区码卡二卡三卡免费 | 久久久久亚洲Av片无码v| 在线观看免费播放av片| 国产亚洲精品a在线无码| 日本免费在线观看| 亚洲区精品久久一区二区三区| 亚欧色视频在线观看免费| 久久精品国产亚洲αv忘忧草| 成年丰满熟妇午夜免费视频| 亚洲成aⅴ人片久青草影院按摩| 国产午夜免费福利红片| 精品无码一级毛片免费视频观看 | 亚洲欧美熟妇综合久久久久| 日韩免费在线观看| 国产精品免费久久久久久久久| 亚洲AV无码码潮喷在线观看| 免费看美女裸露无档网站| 亚洲av最新在线观看网址| 亚洲伊人成无码综合网| 日韩精品内射视频免费观看| 精品亚洲国产成人| 亚洲福利精品一区二区三区| 中文在线免费观看| 亚洲av片不卡无码久久| 亚洲黄片毛片在线观看| 无码精品人妻一区二区三区免费看| 亚洲另类自拍丝袜第1页| 免费A级毛片无码A| 国产99视频精品免费专区| 亚洲综合在线一区二区三区 | 77777午夜亚洲| 久久久久噜噜噜亚洲熟女综合| 亚洲欧洲免费视频| 久久亚洲AV成人无码国产电影| 亚洲AV无码乱码在线观看裸奔| 成年女人毛片免费播放视频m| 三级网站免费观看|