CAS單點登入-用戶端內建(cas-client)(九)
當我們把單點系統搭建好了,或者客戶已經提供好了單點登入服務,往往會想,如何內建cas、如何能在業務系統上用cas(本章隻講cas協定,oauth2、SAML等後續)
但情況往往是這樣的:
- 業務系統已內建shiro
- 業務系統已內建pac4j
- 業務系統已內建spring security
- 業務系統擁有自己一套鑒權機制
而需求一般都是這樣的:
- 當次請求是否需要login,未login跳轉登入,否則允許通過
- 當次請求是否滿足權限要求,不滿足輸出異常
上述說得簡單,但我們的使用時還是有一定的複雜度,例如:
- 以其他使用者身份操作時權限如何處理(權限代理)
- restful、jwt方式鑒權(移動端使用)
但這博文很簡單,完成兩個目标:
- 如何使用cas-client
- 需要登入的跳轉到登入頁
Cas Client特性
- j2ee方式配置(配置web.xml的filter達到單點登入)
- saml協定認證方式
- spring、spring security的內建
當然除了這些還可以內建jetty、tomcat等等
回顧cas協定
cas client如何強大友善,都是遵循着cas協定進行認證,否則是不能完成工作的。
用戶端位址:http://localhost:8080/sample
cas服務位址:https://passport.com
協定流程:
1. 若業務系統未登入,302到https://passport.com?service=http://localhost:8080/sample
2. 使用者送出使用者名密碼後,302到http://localhost:8080/sample?ticket=ABC123
3. 業務系統驗證ticket,并擷取使用者資料,https://passport.com/p3/serviceValidate?service=p3/serviceValidate?service&ticket=ABC123
4. 成功擷取使用者資料
其實我們隻關心兩個階段,其他都交給cas client去完成:
1. 請求的路徑是否需要跳轉到登入頁
2. 回來的使用者是否能通路被請求資源
那麼可想而知,肯定會有兩個filter,其中包括:
1. AuthenticationFilter(用于判斷請求是否需要跳轉到login及鑒權)
2. CallbackFilter(用于cas回調用作校驗ticket以及擷取使用者資料鑒權後302到第一次請求的url)
3. LogoutFilter(退出時作單點退出)
上面說得非常啰嗦,下面馬上來實戰~
實戰
檢視CasClient官網Demo
直接看web.xml,最核心也是這個檔案:
<?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">
<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://localhost: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.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080/sample</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://localhost:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080/sample</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>
</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>
以上的核心點有兩個:
- serverName 用戶端通路路徑
- casServerUrl cas服務路徑
但上面的配置非常的簡單,除了被
排除
的所有路徑都會跳轉進行登入
再加一個需求,判斷路徑是否需要跳轉到登入頁再跳轉,那麼不得不介紹一下
AuthenticationFilter
的一些簡單配置:
屬性名 | 類型 | 備注 | 預設值 | 是否必須 |
---|---|---|---|---|
casServerUrlPrefix | string | cas服務路徑 | 必須 | |
serverName | string | 用戶端通路路徑 | 必須 | |
renew | boolean | 驗證成功是否新建立會話 | true | 非必須 |
service | string | 服務路徑 | 非必須 | |
ignorePattern | string | 忽略登入路徑正規表達式 | 非必須 | |
ignoreUrlPatternType | string | 忽略路徑表達式類型(可以配置實作UrlPatternMatcherStrategy類路徑) | 非必須 |
自定義鑒權路徑
好的,我們試試新增
zhangsan.jsp(允許不登入)、wangwu.jsp必須登入
然後在實作
UrlPatternMatcherStrategy
進行判斷
SimpleUrlPatternMatcherStrategy.java
/*
* 版權所有.(c)2008-2017. 卡爾科技工作室
*/
package com.carl.auth.sso.client.demo;
import org.jasig.cas.client.authentication.UrlPatternMatcherStrategy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author Carl
* @date 2017/9/28
* @since 1.5.0
*/
public class SimpleUrlPatternMatcherStrategy implements UrlPatternMatcherStrategy {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public boolean matches(String url) {
logger.debug("通路路徑:" + url);
return url.contains("zhangsan.jsp");
}
@Override
public void setPattern(String pattern) {
}
}
認證過濾器配置調整:
<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://passport.sso.com:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
<init-param>
<param-name>ignoreUrlPatternType</param-name>
<param-value>com.carl.auth.sso.client.demo.SimpleUrlPatternMatcherStrategy</param-value>
</init-param>
<init-param>
<param-name>ignorePattern</param-name>
<param-value>.*</param-value>
</init-param>
</filter>
嘗試通路:http://localhost:8080/sample/zhangsan.jsp 不會轉發到登入頁
而:http://localhost:8080/sample/wangwu.jsp 會轉發到登入頁
總結
本章講解了cas-client如何使用,但我們實際上遠遠比這要複雜,當然我們這個demo也作為入門了解階段學習,但目标很明确,要了解cas的整個轉發過程
下一章内容比較多,會說常用shiro的內建,是以必須具備這章的知
下載下傳代碼嘗試:
其他版本可以到GitHub或者碼雲檢視
具體子產品路徑:
sso-client-demo/sso-cas-client-demo
發現一些意外的事情可以考慮翻翻前面的部落格進行學習哦
作者聯系方式
如果技術的交流或者疑問可以聯系或者提出issue。
郵箱:[email protected]
QQ: 756884434 (請注明:SSO-CSDN)