CAS单点登录-单点登出/退出/注销(十二)

CAS单点登录-单点登出/退出/注销(十二)

据说cas3.x开始支持单点注销,但我们目前讲的是5.1.x,当然我们加入了单点登录,一般来说都需要单点注销的,让个子系统支持单点注销需要做一些工作

本章目标

  1. logoutTyle类型讲解
  2. cas退出流程分析
  3. cas client单点退出配置
  4. buji(shiro、pac4j)单点退出配置

重点目标:
A系统需要访问cas输入用户名密码登录,B系统之间通过cas协议能够完成鉴权,B系统退出,A系统也已退出


提示:

有很多朋友问我,怎么做shiro的集成要怎么做怎么做,而shiro已经建议采用buji-pac4j进行集成而不是shiro-cas,但这不是本章的目的,只是说明有必要补充一下pac4j的先关知识,那么pac4j会单独一章/两章一个简单的介绍

LogoutTyle

该配置是配置在service中,如:

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "testId",
  "name" : "testId",
  "id" : 1,
  "logoutType" : "BACK_CHANNEL"
}

NONE:不支持单点登录
BACK_CHANNEL:隐式退出(默认)
FRONT_CHANNEL:显式退出

隐式退出:cas发送通知,业务系统后端主动注销用户
显式退出:cas发送数据给客户端,客户端接收并且注销用户,再转发到cas往下处理注销流程

cas退出流程

由于默认为BACK_CHANNEL,我们只讲BACK_CHANNEL的退出流程

退出流程跟客户端发起的方式参数有关

Created with Raphaël 2.1.0 发起logout 确定TGT,ST 有logoutUrl? 确定已登录service 发退出通知 收到通知注销 完成 入参确定url yes no

以下代码确定发送客户端通知的url

public class DefaultSingleLogoutServiceLogoutUrlBuilder implements SingleLogoutServiceLogoutUrlBuilder {
    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultSingleLogoutServiceLogoutUrlBuilder.class);

    @Override
    public URL determineLogoutUrl(final RegisteredService registeredService, final WebApplicationService singleLogoutService) {
        try {
            final URL serviceLogoutUrl = registeredService.getLogoutUrl();
            if (serviceLogoutUrl != null) {
                LOGGER.debug("Logout request will be sent to [{}] for service [{}]", serviceLogoutUrl, singleLogoutService);
                return serviceLogoutUrl;
            }
            if (UrlValidator.getInstance().isValid(singleLogoutService.getOriginalUrl())) {
                return new URL(singleLogoutService.getOriginalUrl());
            }
            return null;
        } catch (final Exception e) {
            throw new IllegalArgumentException(e);
        }
    }
}

实战

cas client配置

web.xml

SingleSignOutFilter必须是首个过滤器

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

    <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://passport.sso.com:8443/casparam-value>
        init-param>
    filter>

CasClient-10000001.json

需要配置logoutUrl,发送通知交给SingleSignOutFilter处理

{
  "@class": "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(https|imaps|http)://localhost:8080/sample.*",
  "name": "CasClient-demo",
  "id": 10000001,
  "description": "CasClient-demo service",
  "evaluationOrder": 100,
  "theme":"apereo",
  "logoutUrl": "http://localhost:8080/sample/"
}

shiro-cas配置

目前buji不会处理cas收到的通知,目前还不能通过其他客户端退出控制本客户端,目前通过shiro-cas退出,cas-client所有集成的客户端已经实现单点登出功能

若找到更好的办法处理shiro-cas的单点退出功能,请评论或者联系我,非常感谢~

其他配置

cas:application.properties

#允许发出退出控制退出后转发url
cas.logout.followServiceRedirects=true

下载代码尝试: 其他版本可以到GitHub或者码云查看

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

总结

本章主要是单点登出的简单介绍以及教程,主要实现了cas-client的单点登出,shiro待完善,那么下一个阶段版本为1.6,会新增些特性非常值得期待

  • 密码找回
  • 自定义校验器
  • QQ登录
  • tgt,st持久化

作者联系方式

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

邮箱:[email protected]

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

你可能感兴趣的:(cas)