CAS单点登录-客户端集成(cas-client)(九)

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,最核心也是这个文件:


<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 Filterfilter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilterfilter-class>
        <init-param>
            <param-name>casServerUrlPrefixparam-name>
            <param-value>https://localhost:8443/casparam-value>
        init-param>
    filter>

    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListenerlistener-class>
    listener>

    <filter>
        <filter-name>CAS Authentication Filterfilter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
        <init-param>
            <param-name>casServerLoginUrlparam-name>
            <param-value>https://localhost:8443/cas/loginparam-value>
        init-param>
        <init-param>
            <param-name>serverNameparam-name>
            <param-value>http://localhost:8080/sampleparam-value>
        init-param>
    filter>

    <filter>
        <filter-name>CAS Validation Filterfilter-name>

        <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilterfilter-class>
        <init-param>
            <param-name>casServerUrlPrefixparam-name>
            <param-value>https://localhost:8443/casparam-value>
        init-param>
        <init-param>
            <param-name>serverNameparam-name>
            <param-value>http://localhost:8080/sampleparam-value>
        init-param>
        <init-param>
            <param-name>redirectAfterValidationparam-name>
            <param-value>trueparam-value>
        init-param>
        <init-param>
            <param-name>useSessionparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>

    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilterfilter-class>
    filter>

    <filter-mapping>
        <filter-name>CAS Single Sign Out Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    <filter-mapping>
        <filter-name>CAS Validation Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    <filter-mapping>
        <filter-name>CAS Authentication Filterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>

    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filterfilter-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 Filterfilter-name>
        
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilterfilter-class>
        <init-param>
            <param-name>casServerLoginUrlparam-name>
            <param-value>https://passport.sso.com:8443/cas/loginparam-value>
        init-param>
        <init-param>
            <param-name>serverNameparam-name>
            <param-value>http://localhost:8080param-value>
        init-param>
        <init-param>
            <param-name>ignoreUrlPatternTypeparam-name>
            <param-value>com.carl.auth.sso.client.demo.SimpleUrlPatternMatcherStrategyparam-value>
        init-param>
        <init-param>
            <param-name>ignorePatternparam-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)

你可能感兴趣的:(cas)