搭建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>
到此完成資料庫賬戶密碼的驗證!