1. 程式人生 > >搭建CAS單點登入的Demo

搭建CAS單點登入的Demo

現在很多系統並不是單一的,而是幾個系統可以共同運作,相輔相成,這時,如果讓使用者一個系統一個系統的登入再一個一個地登出,顯然體驗感是不好的。如此便有了單點登入,實現一次登入,可以訪問所有相關係統,訪問完之後只需要一次登出。

搜了比較多的資料,將單點登入的原理的很多,這裡可以放一篇瞭解一下原理:https://www.cnblogs.com/gy19920604/p/6029210.html

本篇部落格主要記錄搭建單點系統的過程。原始碼下載

一、下載CAS

先下載一個CAS開源專案:https://www.apereo.org/projects/cas/download-cas

我目前下載的是3.5的。

二、搭建CAS中央伺服器

1、將下載的CAS解壓得到如下目錄,注意打箭頭的資料夾,我們將把這裡面的專案導進eclipse。

2、新建一個web專案,將cas-server-3.5.0\cas-server-webapp\src\main\webapp目錄下的檔案放進新建專案的 WebContent目錄下。

3、將\cas-server-3.5.0\cas-server-webapp\src\main\java下的org檔案複製放到新建專案的src下。

4、解壓1中圖中的modules資料夾下面cas-server-webapp-3.5.0.war(即\cas-server-3.5.0\modules\cas-server-webapp-3.5.0.war)。將解壓後的\modules\cas-server-webapp-3.5.0\WEB-INF\lib資料夾下面的jar拷貝到新建專案的lib目錄下。

5、WEB-INF/deployerConfigContext.xml為了簡單起見,我們不啟用HTTPS,新增requireSecure為false:

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />

6、ticketGrantingTicketCookieGenerator.xml同樣新增cookieSecure為false:

<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="-1"
        p:cookieName="CASTGC"
        p:cookiePath="/cas" />

7、warnCookieGenerator.xml同樣新增cookieSecure為false:

<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
        p:cookieSecure="false"
        p:cookieMaxAge="-1"
        p:cookieName="CASPRIVACY"
        p:cookiePath="/cas" />

8、在cas.properties中可以修改server.name中的域名和埠號。

到此中央伺服器搭建完成,啟動後就可以看到登入介面如下圖:

使用者名稱和密碼輸入相同的就可以登入成功了,如test/test。

 

三、建立客戶端專案CAS-web1

1、新建一個Maven專案,Maven專案的建立參照:https://blog.csdn.net/fancheng614/article/details/77712843

2、新增依賴jar

    <dependency>
	    <groupId>org.jasig.cas.client</groupId>
	    <artifactId>cas-client-core</artifactId>
	    <version>3.2.1</version>
	</dependency>
	<dependency>
	    <groupId>log4j</groupId>
	    <artifactId>log4j</artifactId>
	    <version>1.2.16</version>
	</dependency>

3、修改專案的web.xml

注意<param-name>casServerLoginUrl</param-name>、<param-name>serverName</param-name>、<param-name>casServerUrlPrefix</param-name>、<param-name>serverName</param-name>下面對應的<param-value>的值。

  	<welcome-file-list>
  		<welcome-file>index.jsp</welcome-file>
  	</welcome-file-list>
	  <!-- ======================== start ======================== -->
	<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>CAS Filter</filter-name>
	    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
	    <init-param>
	        <param-name>casServerLoginUrl</param-name>
	        <!-- 這裡配置中央系統的域名 -->
	        <param-value>http://127.0.0.1:8081/CAS/login</param-value>
	    </init-param>
	    <init-param>
	        <param-name>serverName</param-name>
	        <!-- 這裡配置本系統的域名 -->
	        <param-value>http://127.0.0.1:8080/</param-value>
	    </init-param>
	</filter>
	<filter-mapping>
	    <filter-name>CAS Filter</filter-name>
	    <url-pattern>/*</url-pattern>
	</filter-mapping>
	<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://127.0.0.1:8081/CAS/</param-value>
	    </init-param>
	    <init-param>
	        <param-name>serverName</param-name>
	        <!-- 這裡配置本系統的域名 -->
	        <param-value>http://127.0.0.1:8080</param-value>
	    </init-param>
	</filter>
	<filter-mapping>
	    <filter-name>CAS Validation Filter</filter-name>
	    <url-pattern>/*</url-pattern>
	</filter-mapping>
	<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>
	<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>
	<!-- ======================== end ======================== -->

致此,釋出CAS-web1專案訪問它的index.jap時會跳往CAS的登入介面,輸入使用者名稱和密碼相同的值後會跳回CAS-web1的index.jsp頁面。

 

四、實現CAS登入訪問資料庫使用者表

此過程需要新增的jar:cas-server-support-jdbc-3.5.0.jar、ojdbc14.jar

1、在deployerConfigContext.xml檔案中<property name="authenticationHandlers">標籤下修改:

刪除預設的驗證方式:

<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

然後新增資料庫驗證方式:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
	<property name="dataSource" ref="dataSource"></property>
	<property name="sql" value="select userpassword from tuser where username=?"> 
    </property>
	<property name="passwordEncoder" ref="md5PasswordEncoder"></property>
</bean>

2、在deployerConfigContext.xml檔案中的<beans>標籤下新增資料來源,並配置加密方式

	<!-- 配置資料來源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	   <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
	   <property name="url"><value>jdbc:oracle:thin:@localhost:1521:ORCL</value></property>
	   <property name="username"><value>scott</value></property>
	   <property name="password"><value>scott</value></property>
	</bean>	
	
	<!-- 配置加密方式 ,自定義加密方式-->
	 <bean id="md5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
         <constructor-arg index="0">
             <value>MD5</value>
        </constructor-arg>
    </bean>

到此完成資料庫賬戶密碼的驗證!