本文目标
基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出。
本文基于《CAS学习笔记三:SpringBoot自动/手动配置方式集成CAS单点登录》的代码扩充而来,完整代码见 https://github.com/hellxz/cas-integration-demo
CAS服务端配置
单点登出跟随 service 给出的跳转地址重定向功能 在 CAS 服务端默认是关闭的,所以需要先开启它。
vim webapps/cas/WEB-INF/classes/application.properties
在最下方追加配置项 cas.logout.followServiceRedirects=true,保存重启CAS服务端。
代码目录结构
以上红字仅对本文修改的部分进行说明,其余请参考之前单点登录的实现文章。
代码实现
仅增量介绍关键类
SpringBoot自动配置登出实现
CasClientConfigurerImpl.java
package com.hellxz.cas;
import java.util.Map;
import org.jasig.cas.client.boot.configuration.CasClientConfigurer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.stereotype.Component;
/**
* cas-client-support-springboot 依赖提供了CAS客户端的自动配置,
* 当自动配置不满足需要时,可通过实现{@link CasClientConfigurer}接口来重写需要自定义的逻辑
*/
@Component
public class CasClientConfigurerImpl implements CasClientConfigurer {
/**
* 配置认证过滤器,添加忽略参数,使/logoutPage登出提示页免登录
*/
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public void configureAuthenticationFilter(final FilterRegistrationBean authenticationFilter) {
Map initParameters = authenticationFilter.getInitParameters();
initParameters.put("ignorePattern", "/logoutPage");
}
}
上边这个配置类的作用是自定义认证过滤器,将 /logoutPage 排除不走认证逻辑,此页面用于显示登出提示。
CasAutoConfigApp.java
package com.hellxz.cas;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jasig.cas.client.boot.configuration.EnableCasClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@EnableCasClient
public class CasAutoConfigApp {
@Value("${custom.cas.single-logout-url:}")
public String casSingleLogoutUrl;
public static void main(String[] args) {
SpringApplication.run(CasAutoConfigApp.class, args);
}
@GetMapping("/test")
public String test(HttpServletRequest request) {
return "服务A测试通过";
}
/**
* 首页,需要登录
*/
@GetMapping("/index")
public String index(HttpServletRequest request) {
//@formatter:off
return "<h1>登录成功</h1><br><br>"
+ "<a href=\"/logout\">退出登录</a><br><br>"
+ "<a href=\"" + casSingleLogoutUrl + "\">全局退出登录</a>";
//@formatter:on
}
/**
* 登出提示页,免登录
*/
@GetMapping("/logoutPage")
public String logoutPage(HttpServletResponse response) {
//@formatter:off
return "<h1&g