据说cas3.x开始支持单点注销,但我们目前讲的是5.1.x,当然我们加入了单点登录,一般来说都需要单点注销的,让个子系统支持单点注销需要做一些工作
重点目标:
A系统需要访问cas输入用户名密码登录,B系统之间通过cas协议能够完成鉴权,B系统退出,A系统也已退出
提示:
有很多朋友问我,怎么做shiro的集成要怎么做怎么做,而shiro已经建议采用buji-pac4j进行集成而不是shiro-cas,但这不是本章的目的,只是说明有必要补充一下pac4j的先关知识,那么pac4j会单独一章/两章一个简单的介绍
该配置是配置在service中,如:
{
"@class" : "org.apereo.cas.services.RegexRegisteredService",
"serviceId" : "testId",
"name" : "testId",
"id" : 1,
"logoutType" : "BACK_CHANNEL"
}
NONE:不支持单点登录
BACK_CHANNEL:隐式退出(默认)
FRONT_CHANNEL:显式退出
隐式退出:cas发送通知,业务系统后端主动注销用户
显式退出:cas发送数据给客户端,客户端接收并且注销用户,再转发到cas往下处理注销流程
由于默认为BACK_CHANNEL,我们只讲BACK_CHANNEL的退出流程
退出流程跟客户端发起的方式参数有关
以下代码确定发送客户端通知的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);
}
}
}
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>
需要配置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/"
}
目前
buji
不会处理cas收到的通知,目前还不能通过其他客户端退出控制本客户端,目前通过shiro-cas退出,cas-client所有集成的客户端已经实现单点登出功能
若找到更好的办法处理shiro-cas的单点退出功能,请评论或者联系我,非常感谢~
cas:application.properties
#允许发出退出控制退出后转发url
cas.logout.followServiceRedirects=true
下载代码尝试: 其他版本可以到GitHub或者码云查看
发现一些意外的事情可以考虑翻翻前面的博客进行学习哦
本章主要是单点登出的简单介绍以及教程,主要实现了cas-client的单点登出,shiro待完善,那么下一个阶段版本为1.6,会新增些特性非常值得期待
如果技术的交流或者疑问可以联系或者提出issue。
QQ: 756884434 (请注明:SSO-CSDN)