作者:藍雄威,叩丁狼教育高級講師。原創文章,轉載請注明出處。
一、前言
目前為止我們已經搭建好了CAS Server端,我們需要來搭建客戶端配合使用,完成單點登錄和單點注銷的功能.我們將講兩種方式來搭建CAS Client端.一種是普通項目搭建,另一種是基于SpringBoot的項目搭建.
二、普通項目搭建CAS Client
官方提供了一個簡易的模板來搭建CAS Client.
Github地址:https://github.com/cas-projects/cas-sample-java-webapp
下載導入項目之后,我們只需要稍作修改,運行起來就可以使用了.
步驟:
1.下載之后導入到工具中,導入之后項目結構如下圖:
2.項目默認使用的jetty的啟動插件.如果使用tomcat的插件,需要在pom.xml中把jetty配置去掉,添加tomcat的插件.
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8088</port>
<path>/</path>
</configuration>
</plugin>
3.修改web.xml,把里面所有的``casServerUrlPrefix對應的value
值換成你統一認證中心的域名,把所有serverName
對應的value
值換成你當前項目的域名.下方配置也標記了什么地方需要修改.
一定得改對,否則在訪問的時候會出現票根'ST-1-SSAyf0nFMvmVBvEBSXyg-cas'不符合目標服務
的錯誤.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--
<context-param>
<param-name>renew</param-name>
<param-value>true</param-value>
</context-param>
-->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<!--此處需要修改-->
<param-value>https://www.sso.com:8443/cas</param-value>
</init-param>
</filter>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<!--此處需要修改-->
<param-value>https://www.sso.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!--此處需要修改-->
<param-value>http://www.crm.com:8088</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<!--此處需要修改-->
<param-value>https://www.sso.com:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<!--此處需要修改-->
<param-value>http://www.crm.com:8088</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>useSession</param-name>
<param-value>true</param-value>
</init-param>
<!--
<init-param>
<param-name>acceptAnyProxy</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>proxyReceptorUrl</param-name>
<param-value>/sample/proxyUrl</param-value>
</init-param>
<init-param>
<param-name>proxyCallbackUrl</param-name>
<param-value>https://mmoayyed.unicon.net:9443/sample/proxyUrl</param-value>
</init-param>
-->
<init-param>
<param-name>authn_method</param-name>
<param-value>mfa-duo</param-value>
</init-param>
</filter>
<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 Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
</web-app>
三、測試
運行tomcat7:run
命令,把客戶端啟動起來.瀏覽器輸入http://www.crm.com:8088/index.jsp
,此時頁面會跳轉到統一認證中心的登陸頁面.
但是會看到如下的錯誤信息:未認證授權的服務
,
這是因為CAS Server端默認只接收https的客戶端請求,如果想讓CAS Server支持http協議的客戶端請求,需要在服務端添加一些配置.
服務端修改如下:
操作步驟(1)
1.1 拷貝overlays/org.apereo.cas.cas-server-webapp-tomcat-5.2.3/WEB-INF/classes/services/HTTPSandIMAPS-10000001.json
文件到/src/main/resources/services
目錄.
1.2 修改services\HTTPSandIMAPS-10000001.json文件
"serviceId" : "^(https|imaps)://."
改為==>
"serviceId" : "^(https|http|imaps)://.",
操作步驟(2): 在application.properties文件中添加:
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
配置好之后,重新啟動客戶端和服務端.登陸之后會自動跳轉到客戶端的首頁.看到如下這張圖說明CAS Server端和CAS Client端已經整合成功.
四、單點注銷
CAS框架已經集成了單點注銷的功能,只需要統一認證中心注銷之后,所有的子系統都統一的注銷了.
啟動兩個客戶端,端口分別為8088
,8089
,在訪問的時候只需要訪問一次即可.
當統一認證中心注銷的時候,所有的子系統都統統注銷了.
這需要在客戶端中的退出按鈕,指向統一認證中心的注銷方法即可
<a >注銷</a>
當我們訪問完這個方法之后,所有的子系統會自動的注銷.
1.默認請求訪問統一認證中心的logout方法后,響應的是統一認證中心的注銷頁面.
2.如果我們希望注銷之后,能回到子系統中的某個頁面,此時可以在地址欄后面添加service的參數,統一認證中心會在注銷之后,會重定向到http://www.crm.com:8088/index.jsp
這個地址.這個需要在服務端配置一個參數:
cas.logout.followServiceRedirects=true
五、基于SpringBoot的客戶端集成CAS
SpringBoot相關的知識.
叩丁狼教育-Springboot高級實戰課(第一期)
叩丁狼教育-Springboot高級實戰課(第二期)
我們要在SpringBoot的環境下使用CAS的功能,首先需要想到的是有沒有對應的starter可以幫我們快速構建.我們使用使用了cas-client-autoconfig-support項目的集成能力.Github地址:
https://github.com/Unicon/cas-client-autoconfig-support
步驟:
1.在SpringBoot應用的Maven配置文件(pom.xml)中添加依賴:
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>1.5.0-GA</version>
</dependency>
2.在應用啟動入口類上添加配置@EnableCasClient,示例:
@SpringBootApplication
@EnableCasClient
public class CrmApplication{ .. }
3.在應用的配置文件中(application.properties)添加如下配置:
# 項目端口
server.port=8088
# 填CAS服務器的前綴
cas.server-url-prefix=https://www.sso.com:8443/cas
# 填CAS服務器的登錄地址
cas.server-login-url=https://www.sso.com:8443/cas/login
# 填客戶端的訪問前綴 www.crm.com是在host文件中配置的映射,映射到127.0.0.1
cas.client-host-url=http://www.crm.com:8088
啟動項目即可,這樣SpringBoot就和CAS集成完成了.