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

<?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的一些简单配置:

属性名类型备注默认值是否必须
casServerUrlPrefixstringcas服务路径必须
serverNamestring客户端访问路径必须
renewboolean验证成功是否新创建会话true非必须
servicestring服务路径非必须
ignorePatternstring忽略登录路径正则表达式非必须
ignoreUrlPatternTypestring忽略路径表达式类型(可以配置实现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 其他版本可以到GitHub或者码云查看

具体模块路径:sso-client-demo/sso-cas-client-demo

发现一些意外的事情可以考虑翻翻前面的博客进行学习哦

作者联系方式

如果技术的交流或者疑问可以联系或者提出issue。

邮箱:huang.wenbin@foxmail.com

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

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud集成CAS单点登录的流程大致如下: 1. 配置CAS服务端 首先需要搭建一个CAS服务端,配置好CAS的登录页面、认证策略、用户信息源等。具体的配置可以参考CAS官方文档。 2. 集成CAS客户端 在Spring Cloud应用中,需要添加CAS客户端的依赖包,例如: ``` <dependency> <groupId>org.jasig.cas.client</groupId> <artifactId>cas-client-core</artifactId> <version>3.6.2</version> </dependency> ``` 在Spring Boot应用中,可以通过配置文件来配置CAS客户端,例如: ``` cas.server-url-prefix=https://cas.server.com/ cas.server-login-url=https://cas.server.com/login cas.client-host-url=https://app.client.com/ ``` 其中,`cas.server-url-prefix`为CAS服务端的URL前缀,`cas.server-login-url`为CAS服务端的登录页面URL,`cas.client-host-url`为当前应用的URL。 3. 集成Spring Security 在Spring Cloud应用中,可以使用Spring Security框架来实现安全认证和授权功能。需要在配置文件中添加Spring Security的配置,例如: ``` spring.security.user.name=user spring.security.user.password=password ``` 这里指定了一个默认的用户名和密码。 4. 配置过滤器 最后需要配置CAS客户端的过滤器,用于拦截CAS服务端的认证请求和响应。在Spring Cloud应用中,可以使用`CasAuthenticationFilter`和`CasAuthenticationEntryPoint`两个过滤器来实现CAS单点登录功能。具体的配置可以参考CAS官方文档。 完成以上步骤后,就可以通过CAS服务端来实现Spring Cloud应用的单点登录功能了。用户只需要在CAS服务端登录一次,就可以访问多个Spring Cloud应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值