CAS之——自定义改造
本文总结一些CAS集成过程中的自定义改造需求与实现,持续更新,也欢迎各位前辈提出意见与建议。
更新日志
- 2018-12-30 初次添加
- 2019-01-20 集成redis存储ticket
环境
- CAS服务端:cas-4.0.0,下载部署参见此篇文章
- cas客户端:引用第三方jar包
- 项目:JDK1.8、Spring Boot
-
结构
-
pom.xml:添加第三方jar包即可:
-
Main.java:增加@EnableCasClient()注解即可
-
WellcomeController.java:
-
application.yml:
-
- 本地nginx配置:
一、改造:SSO认证通过后回跳地址支持一个域名多个上下文
-
需求:
- 访问 http://casclient.develop.com/client1/welcome 时,在完成SSO认证后,回跳到此地址
- 现在:客户端生成的回跳地址service地址缺少项目上下文/client1,导致回跳地址为:http://casclient.develop.com/welcome ,SSO认证失败
-
原先:回跳地址会“丢失”CAS客户端项目上下文。
- 访问 http://casclient.develop.com/client1/welcome ,因未登陆而重定向到CAS服务端
- CAS服务地址栏中的现象:
- 认证成功后,回跳不到客户端:
- 原因:org.jasig.cas.client.util.CommonUtils.constructServiceUrl方法中构造service时,丢失了项目的上下文:
-
改造:
- 在项目中重写 org.jasig.cas.client.util.CommonUtils.constructServiceUrl方法:
- 在项目中重写 org.jasig.cas.client.util.CommonUtils.constructServiceUrl方法:
二、改造:CAS客户端实现单点登出(logout)
- 需求:
- 在多项目(CAS客户端)同时使用相同CAS服务时,只要在一个客户端退出登录,其他所有端均退出登录状态
- 现在:一个客户端退出登录,其他客户端仍然可以访问受限资源
- 改造:添加logout过滤器和监听器
- 增加客户端退出接口:如需退出,直接访问当前客户端的/logout接口即可
- 在此文 基础上做了一个小改动即可实现:
- 增加客户端退出接口:如需退出,直接访问当前客户端的/logout接口即可
import net.unicon.cas.client.configuration.CasClientConfigurationProperties;
import org.jasig.cas.client.session.SingleSignOutFilter;
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CASConfigutaions {
/**
* 通过net.unicon.cas包获取配置
*/
@Autowired
CasClientConfigurationProperties configProps;
@Bean
public SingleSignOutFilter singleSignOutFilter(){
return new SingleSignOutFilter();
}
@Bean
public FilterRegistrationBean singleSignOutFilterBean(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(singleSignOutFilter());
// filterRegistrationBean.addInitParameter("targetFilterLifecycle","true");
filterRegistrationBean.setEnabled(true);
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setOrder(1);
//设置cas配置->此处通过net.unicon.cas包获取配置
filterRegistrationBean.addInitParameter("casServerUrlPrefix", configProps.getServerUrlPrefix());
filterRegistrationBean.addInitParameter("serverName", configProps.getClientHostUrl());
filterRegistrationBean.setName("singleFilter");
System.out.println("================================singleFilter执行");
return filterRegistrationBean;
}
@Bean
public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener(){
return new SingleSignOutHttpSessionListener();
}
@Bean
public ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> singleSignOutHttpSessionListenerBean()