天天看點

CAS單點登入-用戶端內建(cas-client)(九)CAS單點登入-用戶端內建(cas-client)(九)Cas Client特性回顧cas協定實戰自定義鑒權路徑總結作者聯系方式

CAS單點登入-用戶端內建(cas-client)(九)

當我們把單點系統搭建好了,或者客戶已經提供好了單點登入服務,往往會想,如何內建cas、如何能在業務系統上用cas(本章隻講cas協定,oauth2、SAML等後續)

但情況往往是這樣的:

  • 業務系統已內建shiro
  • 業務系統已內建pac4j
  • 業務系統已內建spring security
  • 業務系統擁有自己一套鑒權機制

而需求一般都是這樣的:

  • 當次請求是否需要login,未login跳轉登入,否則允許通過
  • 當次請求是否滿足權限要求,不滿足輸出異常

上述說得簡單,但我們的使用時還是有一定的複雜度,例如:

  • 以其他使用者身份操作時權限如何處理(權限代理)
  • restful、jwt方式鑒權(移動端使用)

但這博文很簡單,完成兩個目标:

  1. 如何使用cas-client
  2. 需要登入的跳轉到登入頁

Cas Client特性

  1. j2ee方式配置(配置web.xml的filter達到單點登入)
  2. saml協定認證方式
  3. 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的內建,是以必須具備這章的知

下載下傳代碼嘗試:

CAS單點登入-用戶端內建(cas-client)(九)CAS單點登入-用戶端內建(cas-client)(九)Cas Client特性回顧cas協定實戰自定義鑒權路徑總結作者聯系方式

其他版本可以到GitHub或者碼雲檢視

具體子產品路徑:

sso-client-demo/sso-cas-client-demo

發現一些意外的事情可以考慮翻翻前面的部落格進行學習哦

作者聯系方式

如果技術的交流或者疑問可以聯系或者提出issue。

郵箱:[email protected]

QQ: 756884434 (請注明:SSO-CSDN)

繼續閱讀