cas單點登陸登出配置,學習記錄

1、服務端配置:java

證書web

進入cmd,不需更改cdspring

第一種方法:sql

一、用JDK自帶的keytool生成證書數據庫

keytool -genkey -alias  sso -keyalg RSA -keystore e:/keys/ssokey apache

其中名字與姓氏寫服務端域名,能夠在C:\Windows\System32\drivers\etc\hosts文件中映射一個虛擬域名(127.0.0.1   sso),注意不要寫IP。tomcat

二、導出證書安全

keytool -export -file e:/keys/ssokey.crt -alias sso -keystore e:/keys/ssokey服務器

三、把證書導入到客戶端JDK中session

把服務端導出的證書發送給客戶端,在客戶端導入

keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:/keys/ssokey.crt -alias sso

或者

keytool-import -trustcacerts -alias server -file e:/keys/ssokey.crt -keystore e:/keys/cacerts,將會在該目錄下產生一個cacerts文件,將這個文件,將這個文件拷貝覆蓋到

客戶端%JAVA_HOME%/jre/lib/security中。

 

服務端tomcat配置:

一、下載CAS的服務端,解壓,把解壓後的文件中modules文件夾中的cas-server-webapp-3.4.8.war文件拷貝的%TOMCAT_HOME%\webapps下,並修改文件名爲:cas.war。

二、修改%TOMCAT_HOME%\conf\server.xml文件去掉此文件83到93行之間的註釋,修改成:

       <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  

               maxThreads="150" scheme="https" secure="true"  

               clientAuth="false" sslProtocol="TLS"   

               keystoreFile=" e:/keys/ssokey"  <!--在2.1中生成的證書的位置-->  

               keystorePass="123456"/>       <!--在2.1中設置的密碼-->  

三、以上配置完成訪問http://localhost:8443/cas

點擊繼續瀏覽會出現,登錄驗證(此時用戶名和密碼相同便可)

 

讀取數據庫的信息進行身份驗證:

在 modules 目錄下能夠找到包cas-server-support-jdbc-3.3.4.jar,再下載個ojdbc的jar包,將兩個包拷貝到cas\WEB-INF\lib目錄下

DataStore依賴於 spring.jar, commons-collections.jar,commons-dbcp.jar, commons-pool.jar

在apache和spring官方網找到這四個包把它們拷貝到cas\WEB-INF\lib下

 

打開tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件

註釋掉92行:SimpleTestUsernamePasswordAuthenticationHandler這個驗證Handler,這個是比較簡單的,只是判斷用戶名和密碼相同便可經過,這個確定不能在實際應用中使用,棄用!

下面的代碼替換:

<beanclass="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> 

                                   <propertyname="dataSource" ref="dataSource" /> 

                                   <propertyname="sql" value="select password from users whereusername=?" /> 

                                   <propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>

                                   <!--<propertyname="passwordEncoder" ref="MyPasswordEncoder"/>-->

                            </bean>

在文件的末尾以前加入以下代碼:

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

       <propertyname="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>   

       <propertyname="url"><value>jdbc:oracle:thin:@localhost :1521:orcl</value></property>   

       <propertyname="username"><value>hr</value></property>   

       <propertyname="password"><value>orcl</value></property>

</bean> 

 

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

      <constructor-argindex="0">  

       <value>MD5</value> 

       </constructor-arg>

</bean>

 

密碼加密問題:

使用md5加密(32位)——oracle數據庫中要使用加密後的密碼

也能夠不加,只需將deployerConfigContext.xml中md5依賴取消,即下行代碼刪除   

<propertyname="passwordEncoder" ref="MD5PasswordEncoder"/>

 

解決中文亂碼

直接利用spring的編碼器進行utf-8編碼,在web.xml中添加

<filter>

<filter-name>encodingFilter</filter-name>

<filter-class> org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param> 

<param-name>encoding</param-name>

<param-value>utf-8</param-value>

</init-param> 

</filter>

<filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

須要注意的是,此配置須要在

 <filter-mapping>

<filter-name>CAS Client Info Logging Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>的上方

 

中文用戶名客戶端亂碼解決方案

因 爲cas默認對中文是不支持的,在cas服務端與客戶端之間,若是有中文存在,會有中文亂碼的問題,雖然上文對請求進行了編碼,可是客戶端中文亂碼的問題 始終存在。爲了不中文亂碼的存在,臨時解決方案是在服務器端對中文進行base64加密,在客戶端進行base64解密。

一、服務端加密:

找到org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver類的源代碼,這個類在cas-server-core-3.3.4.jar包中

找到 protectedString extractPrincipalId(final Credentials credentials)方法,將

returnusernamePasswordCredentials.getUsername();

改成return (newsun.misc.BASE64Encoder()).encode(usernamePasswordCredentials.getUsername().getBytes());

這樣就能夠在服務器端對全部用戶名進行base64加密了

二、客戶端解密:

在客戶端配置處說明

 

服務端配置完成,訪問https://sso:8443/cas,登錄驗證

2、客戶端配置:

注意:若是在一臺電腦上,不能使用同一個端口,本例客戶端使用8081端口

 

1、2.0x(是耶魯的版本):

下載cas-client-2.0.11.zip解壓

 

官方配置:

將cas-client-2.0.11\java\src源碼或則lib \ jar包(casclient.jar,servlet.jar)導入到現有工程,在web.xml中添加官方文檔配置,以下:

<filter>

              <filter-name>CASFilter</filter-name>

              <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

                     <param-value>https://192.168.135.231:8443/cas/login</param- value><!--這裏是cas服務器的地址,能夠用ip,也能夠用自定義地址,如本例的sso -->

              </init-param>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

                     <param-value>https://sso:8443/cas/serviceValidate</param-value><!--這裏的是代理地址,爲證書中的服務端域名-->

              </init-param>

              <init-param>

                     <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

                     <param-value>localhost:8081</param-value><!--這裏是cas客戶端的地址,注意前邊不加http://,由於跳轉回來時已經有了-->

              </init-param>

       </filter>

 

       <filter-mapping>

              <filter-name>CASFilter</filter-name>

              <!--對訪問/servlet/HelloWorldExample 進行攔截,轉向cas服務器端驗證-->

              <url-pattern>/*</url-pattern>

       </filter-mapping>

 

自定義配置:

導入源碼,修改edu.yale.its.tp.cas.client.filter.CASFilter類

1. 聲明兩個屬性

private Stringcasclientport,casclientName,casserverport,casserverName;

2. 在init方法中添加

casclientport =config.getInitParameter("edu.yale.its.tp.cas.client.filter.port");

casclientName =config.getInitParameter("edu.yale.its.tp.cas.client.filter.serverName");

casserverport =config.getInitParameter("edu.yale.its.tp.cas.server.filter.port");

casserverName =config.getInitParameter("edu.yale.its.tp.cas.server.filter.serverName");

(獲取xml中指定的地址和端口號)

3. 在doFilter方法中添加

casLogin="https://"+casserverName+":"+casserverport+"/cas/login";//cas服務器的登入地址

casServerName=casclientName+":"+casclientport;//這是cas客戶端的地址,此處也可使用casServerName = request.getServerName()+":"+casclientport;

casValidate="https://"+casserverName+":"+casserverport+"/cas/serviceValidate";//cas服務器的驗證地址

四、修改客戶端web.xml

<!-- CAS -->

<filter>

<filter-name>CASFilter</filter-name>

<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

<param-value>/cas/login</param-value><!--默認無需修改 -->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

<param-value>/cas/serviceValidate</param-value><!--默認無需修改 -->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.port</param-name>

<param-value>8081</param-value><!--對應客戶端端口號-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

<param-value>localhost</param-value><!--這是服務器端驗證後訪問的地址-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.server.filter.port</param-name>

<param-value>8443</param-value><!--對應服務器端口號 由於是ssl安全鏈接,因此是8443-->

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.server.filter.serverName</param-name>

<param-value>sso</param-value><!--對應服務器域名-->

</init-param>

</filter>

<!-- 對訪問/*的都進行攔截,並轉向cas服務器,進行登入驗證 -->

<filter-mapping>

<filter-name>CASFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<!-- CAS end  -->

 

2.x版本暫時沒有找到單點登出,藉助3.x版本實現

下 載cas-client-3.1.12.zip並解壓,在modules文件夾中有jar包(cas-client-core- 3.1.12.jar,commons-logging-1.1.jar),複製到應用的WEB-INF/lib目錄中,或則複用源代碼。客戶端的 web.xml中添加:

<!-- 該過濾器用於實現單點登出功能可選配置-->

       <listener>

       <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

       </listener>

       <filter>

              <filter-name>CASSingle Sign Out Filter</filter-name>

              <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

       </filter>

       <filter-mapping>

              <filter-name>CASSingle Sign Out Filter</filter-name>

              <url-pattern>/*</url-pattern>  <!--這裏必須是/*,由於這裏是由SSO服務器向每一個客戶端發送請求,這裏負責攔截-->

       </filter-mapping>

 

客戶端亂碼解決:

由於咱們上文對中文在服務器端進行了base64加密,在客戶端,就須要進行解密

仍是對CASFilter類進行修改

在讀doFilter方法中找到如下語句

       if (session != null) // probably unncessary

           session.setAttribute(CAS_FILTER_USER, user);

將它修改成

     if (session != null) // probably unncessary

       {

           session.setAttribute(CAS_FILTER_USER, new String((new BASE64Decoder()).decodeBuffer(user)));

       }

這就是對base64加密的數據進行解密後再存放進客戶端的session。

 

2、3.0x(jasig版本)

下載cas-client-3.1.12.zip並解壓,在modules文件夾中有須要的jar包,請根據本身的項目狀況選擇使用,複製到應用的WEB-INF/lib目錄中。客戶端的web.xml中添加:

<!-- ======================== 單點登陸開始 ========================-->

        <!-- 該過濾器用於實現單點登出功能可選配置-->

       <listener>

              <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

       </listener>

       <filter>

              <filter-name>CASSingle Sign Out Filter</filter-name>

              <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

       </filter>

       <filter-mapping>

              <filter-name>CASSingle Sign Out Filter</filter-name>

              <url-pattern>/*</url-pattern>  <!--這裏必須是/*,由於這裏是由SSO服務器向每一個客戶端發送請求,這裏負責攔截-->

       </filter-mapping>

      

       <!--登陸 -->

   <filter> 

     <filter-name>CAS Authentication Filter</filter-name> 

     <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 

     <init-param> 

       <param-name>casServerLoginUrl</param-name> 

       <param-value>https://sso:8443/cas/login</param-value>  

     </init-param> 

     <init-param> 

       <param-name>serverName</param-name> 

       <param-value>localhost:8081</param-value> 

     </init-param> 

     <init-param> 

       <param-name>gateway</param-name> 

       <param-value>false </param-value> 

     </init-param> 

   </filter> 

   <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>https://sso:8443/cas</param-value>  

     </init-param> 

     <init-param> 

       <param-name>serverName</param-name> 

       <param-value>localhost:8081</param-value> 

     </init-param> 

     <init-param> 

       <param-name>acceptAnyProxy</param-name> 

       <param-value>true </param-value> 

     </init-param> 

   </filter> 

   <filter> 

      <filter-name>CAS HttpServletRequest WrapperFilter</filter-name> 

      <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 

   </filter> 

   <filter> 

     <filter-name>CAS Assertion Thread LocalFilter</filter-name> 

     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 

   </filter> 

 

       <filter-mapping>

              <filter-name>CASAuthentication Filter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

       <filter-mapping>

              <filter-name>CASValidation Filter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

       <filter-mapping>

              <filter-name>CASHttpServletRequest Wrapper Filter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

       <filter-mapping>

              <filter-name>CASAssertion Thread Local Filter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

 

這裏可能出現org.apache.catalina.util.DefaultAnnotationProcessorcannot be cast to org….問題,修改了tomcat裏的context.xml文件,在context 元素下添加: 

<Loader delegate="true" />

 

客戶端配置完成,訪問http://localhost:8081/xxxx ,驗證

 

登陸頁面的擴展:

(1)   如今CAS系統中存在的兩套登錄頁面cas/webapp/WEB-INF/view/jsp/default/ui/和cas/webapp/WEB-INF/view/jsp/simple/ui

(2)   cas/webapp/WEB-INF/cas-servlet.xml

      <bean

              id="viewResolver"

              class="org.springframework.web.servlet.view.ResourceBundleViewResolver">

              <property

                     name="basename"

                     value="simple_views"/>

              <property

                     name="order"

                     value="0"/>

       </bean>

這個bean中basename屬性決定由哪一個屬性文件加載,simple_views.properties仍是default_views.Properties

而屬性文件:

cas/webapp/WEB-INF/classes/default_views.properties

cas/webapp/WEB-INF/classes/simple_views.properties

 

### Login view (/login)

casLoginView.(class)=org.springframework.web.servlet.view.JstlView

casLoginView.url=/WEB-INF/view/jsp/default/ui/casLoginView.jsp

(登錄頁面)

### Login confirmation view (logged in,warn=true)

casLoginConfirmView.(class)=org.springframework.web.servlet.view.JstlView

casLoginConfirmView.url=/WEB-INF/view/jsp/default/ui/casConfirmView.jsp

(當選擇「警告」按鈕時,系統顯示的頁面)

### Logged-in view (logged in, no serviceprovided)

casLoginGenericSuccessView.(class)=org.springframework.web.servlet.view.JstlView

casLoginGenericSuccessView.url=/WEB-INF/view/jsp/default/ui/casGenericSuccess.jsp(成功登錄頁面)

每一個屬性文件決定具體加載頁面的名稱。

 

單點登出:

在客戶端的web.xml文件中增長:

<listener>

<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

</listener>

<filter>

<filter-name>CASSingle Sign Out Filter</filter-name>

<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CASSingle Sign Out Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

註銷的Filter要在其它Filter以前

界面的註銷鏈接到CAS的logout地址,如https://sso:8443/cas/logout

 

cas單點退出回到指定的頁面

退出的連接後加上?service=但願退出後返回的地址

例如  <ahref="https://sso:8443/cas/logout?service=http://localhost:8081/client1">退出</a>

 

本文所需資源下載地址:

cas-server-3.4.2.1-release.zip

http://download.csdn.net/detail/leilovegege/6800507

cas-client-3.1.12-release.zip

http://download.csdn.net/detail/leilovegege/6800481

cas-client-2.0.11.zip

http://download.csdn.net/detail/leilovegege/6800465

opensaml-1.1.jar

http://download.csdn.net/detail/leilovegege/6800361

tangosol.jar

http://download.csdn.net/detail/leilovegege/6800349

相關文章
相關標籤/搜索