spring boot整合CAS配置详解

发布时间 - 2026-01-11 01:08:27    点击率:

在下不才,以下是我花了好几天的时间才整合出来的在spring boot里面的CAS配置整合

为了帮助没搞定的人,毕竟自己踩了很多坑,一步一步爬过来的,有什么不足之处可以给建议  谢谢(小部分代码是整合他人的)

1.不多废话,直接上最重要的代码,以下代码整合cas的重要过程

import org.jasig.cas.client.authentication.AuthenticationFilter; 
import org.jasig.cas.client.session.SingleSignOutFilter; 
import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; 
import org.jasig.cas.client.util.AssertionThreadLocalFilter; 
import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; 
import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter; 
import org.jasig.cas.client.validation.Cas20ServiceTicketValidator; 
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; 
import org.springframework.security.cas.ServiceProperties; 
import org.springframework.security.cas.authentication.CasAuthenticationProvider; 
import org.springframework.security.cas.userdetails.GrantedAuthorityFromAssertionAttributesUserDetailsService; 
import org.springframework.security.web.authentication.logout.LogoutFilter; 
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; 
 
import java.util.List; 
 
 
@Configuration 
public class CasConfig { 
   
  @Autowired 
  SpringCasAutoconfig autoconfig; 
   
  private static boolean casEnabled = true; 
   
  public CasConfig() { 
  } 
 
  @Bean 
  public SpringCasAutoconfig getSpringCasAutoconfig(){ 
    return new SpringCasAutoconfig(); 
  } 
 
  /** 
   * 用于实现单点登出功能 
   */ 
  @Bean 
  public ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> singleSignOutHttpSessionListener() { 
    ServletListenerRegistrationBean<SingleSignOutHttpSessionListener> listener = new ServletListenerRegistrationBean<>(); 
    listener.setEnabled(casEnabled); 
    listener.setListener(new SingleSignOutHttpSessionListener()); 
    listener.setOrder(1); 
    return listener; 
  } 
 
  /** 
   * 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前 
   */ 
  @Bean 
  public FilterRegistrationBean logOutFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    LogoutFilter logoutFilter = new LogoutFilter(autoconfig.getCasServerUrlPrefix() + "/logout?service=" + autoconfig.getServerName(),new SecurityContextLogoutHandler()); 
    filterRegistration.setFilter(logoutFilter); 
    filterRegistration.setEnabled(casEnabled); 
    if(autoconfig.getSignOutFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getSignOutFilters()); 
    else 
      filterRegistration.addUrlPatterns("/logout"); 
    filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 
    filterRegistration.setOrder(2); 
    return filterRegistration; 
  } 
 
  /** 
   * 该过滤器用于实现单点登出功能,单点退出配置,一定要放在其他filter之前 
   */ 
  @Bean 
  public FilterRegistrationBean singleSignOutFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    filterRegistration.setFilter(new SingleSignOutFilter()); 
    filterRegistration.setEnabled(casEnabled); 
    if(autoconfig.getSignOutFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getSignOutFilters()); 
    else 
      filterRegistration.addUrlPatterns("/*"); 
    filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 
    filterRegistration.setOrder(3); 
    return filterRegistration; 
  } 
 
  /** 
   * 该过滤器负责用户的认证工作 
   */ 
  @Bean 
  public FilterRegistrationBean authenticationFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    filterRegistration.setFilter(new AuthenticationFilter()); 
    filterRegistration.setEnabled(casEnabled); 
    if(autoconfig.getAuthFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getAuthFilters()); 
    else 
      filterRegistration.addUrlPatterns("/*"); 
    //casServerLoginUrl:cas服务的登陆url 
    filterRegistration.addInitParameter("casServerLoginUrl", autoconfig.getCasServerLoginUrl()); 
    //本项目登录ip+port 
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 
    filterRegistration.addInitParameter("useSession", autoconfig.isUseSession()?"true":"false"); 
    filterRegistration.addInitParameter("redirectAfterValidation", autoconfig.isRedirectAfterValidation()?"true":"false"); 
    filterRegistration.setOrder(4); 
    return filterRegistration; 
  } 
 
  /** 
   * 该过滤器负责对Ticket的校验工作 
   */ 
  @Bean 
  public FilterRegistrationBean cas20ProxyReceivingTicketValidationFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    Cas20ProxyReceivingTicketValidationFilter cas20ProxyReceivingTicketValidationFilter = new Cas20ProxyReceivingTicketValidationFilter(); 
    //cas20ProxyReceivingTicketValidationFilter.setTicketValidator(cas20ServiceTicketValidator()); 
    cas20ProxyReceivingTicketValidationFilter.setServerName(autoconfig.getServerName()); 
    filterRegistration.setFilter(cas20ProxyReceivingTicketValidationFilter); 
    filterRegistration.setEnabled(casEnabled); 
    if(autoconfig.getValidateFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getValidateFilters()); 
    else 
      filterRegistration.addUrlPatterns("/*"); 
    filterRegistration.addInitParameter("casServerUrlPrefix", autoconfig.getCasServerUrlPrefix()); 
    filterRegistration.addInitParameter("serverName", autoconfig.getServerName()); 
    filterRegistration.setOrder(5); 
    return filterRegistration; 
  } 
 
 
  /** 
   * 该过滤器对HttpServletRequest请求包装, 可通过HttpServletRequest的getRemoteUser()方法获得登录用户的登录名 
   * 
   */ 
  @Bean 
  public FilterRegistrationBean httpServletRequestWrapperFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    filterRegistration.setFilter(new HttpServletRequestWrapperFilter()); 
    filterRegistration.setEnabled(true); 
    if(autoconfig.getRequestWrapperFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getRequestWrapperFilters()); 
    else 
      filterRegistration.addUrlPatterns("/*"); 
    filterRegistration.setOrder(6); 
    return filterRegistration; 
  } 
 
  /** 
   * 该过滤器使得可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 
   比如AssertionHolder.getAssertion().getPrincipal().getName()。 
   这个类把Assertion信息放在ThreadLocal变量中,这样应用程序不在web层也能够获取到当前登录信息 
   */ 
  @Bean 
  public FilterRegistrationBean assertionThreadLocalFilter() { 
    FilterRegistrationBean filterRegistration = new FilterRegistrationBean(); 
    filterRegistration.setFilter(new AssertionThreadLocalFilter()); 
    filterRegistration.setEnabled(true); 
    if(autoconfig.getAssertionFilters().size()>0) 
      filterRegistration.setUrlPatterns(autoconfig.getAssertionFilters()); 
    else 
      filterRegistration.addUrlPatterns("/*"); 
    filterRegistration.setOrder(7); 
    return filterRegistration; 
  } 
} 

2.为了让你们更省力且直接的看到效果,我把相关配置也贴出来

import org.springframework.boot.context.properties.ConfigurationProperties; 
import org.springframework.context.annotation.Configuration; 
 
import java.util.Arrays; 
import java.util.List; 
 
@ConfigurationProperties(prefix = "spring.cas") 
public class SpringCasAutoconfig { 
 
  static final String separator = ","; 
 
  private String validateFilters; 
  private String signOutFilters; 
  private String authFilters; 
  private String assertionFilters; 
  private String requestWrapperFilters; 
 
  private String casServerUrlPrefix; 
  private String casServerLoginUrl; 
  private String serverName; 
  private boolean useSession = true; 
  private boolean redirectAfterValidation = true; 
 
  public List<String> getValidateFilters() { 
    return Arrays.asList(validateFilters.split(separator)); 
  } 
  public void setValidateFilters(String validateFilters) { 
    this.validateFilters = validateFilters; 
  } 
  public List<String> getSignOutFilters() { 
    return Arrays.asList(signOutFilters.split(separator)); 
  } 
  public void setSignOutFilters(String signOutFilters) { 
    this.signOutFilters = signOutFilters; 
  } 
  public List<String> getAuthFilters() { 
    return Arrays.asList(authFilters.split(separator)); 
  } 
  public void setAuthFilters(String authFilters) { 
    this.authFilters = authFilters; 
  } 
  public List<String> getAssertionFilters() { 
    return Arrays.asList(assertionFilters.split(separator)); 
  } 
  public void setAssertionFilters(String assertionFilters) { 
    this.assertionFilters = assertionFilters; 
  } 
  public List<String> getRequestWrapperFilters() { 
    return Arrays.asList(requestWrapperFilters.split(separator)); 
  } 
  public void setRequestWrapperFilters(String requestWrapperFilters) { 
    this.requestWrapperFilters = requestWrapperFilters; 
  } 
  public String getCasServerUrlPrefix() { 
    return casServerUrlPrefix; 
  } 
  public void setCasServerUrlPrefix(String casServerUrlPrefix) { 
    this.casServerUrlPrefix = casServerUrlPrefix; 
  } 
  public String getCasServerLoginUrl() { 
    return casServerLoginUrl; 
  } 
  public void setCasServerLoginUrl(String casServerLoginUrl) { 
    this.casServerLoginUrl = casServerLoginUrl; 
  } 
  public String getServerName() { 
    return serverName; 
  } 
  public void setServerName(String serverName) { 
    this.serverName = serverName; 
  } 
  public boolean isRedirectAfterValidation() { 
    return redirectAfterValidation; 
  } 
  public void setRedirectAfterValidation(boolean redirectAfterValidation) { 
    this.redirectAfterValidation = redirectAfterValidation; 
  } 
  public boolean isUseSession() { 
    return useSession; 
  } 
  public void setUseSession(boolean useSession) { 
    this.useSession = useSession; 
  } 
 
} 

3.配置文件  dev.yml

  #cas client config 
  spring:cas: 
  sign-out-filters: /logout 
  auth-filters: /* 
  validate-filters: /* 
  request-wrapper-filters: /* 
  assertion-filters: /* 
  cas-server-login-url: cas登录url 
  cas-server-url-prefix:cas登录域名 
  redirect-after-validation: true 
  use-session: true 
  server-name: http://localhost:8080

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot集成cas  # boot  # cas  # 整合  # springboot与mybatis整合实例详解(完美融合)  # springboot实现拦截器之验证登录示例  # Spring Boot 启动端口如何启动  # 在Spring Boot中如何使用log4j记录日志  # 详解eclipse下创建第一个spring boot项目  # 深入理解Spring Boot的日志管理  # 基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询  # 详解spring boot配置单点登录  # spring boot实现过滤器和拦截器demo  # SpringBoot获取yml和properties配置文件的内容  # 单点  # 放在  # 登录名  # 的人  # 有什么  # 几天  # 最重要  # 不多  # 我把  # 可以通过  # 花了  # 可通过  # 贴出  # 配置文件  # 大家多多  # 不足之处  # 应用程序  # 爬过  # logout  # GrantedAuthorityFromAssertionAttributesUserDetails 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么为数据库表字段添加索引以优化查询  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Laravel PHP版本要求一览_Laravel各版本环境要求对照  ,网页ppt怎么弄成自己的ppt?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  韩国服务器如何优化跨境访问实现高效连接?  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel如何处理文件下载请求?(Response示例)  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  制作电商网页,电商供应链怎么做?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  浅谈redis在项目中的应用  Laravel如何生成URL和重定向?(路由助手函数)  如何用VPS主机快速搭建个人网站?  JavaScript Ajax实现异步通信  JavaScript模板引擎Template.js使用详解  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  专业商城网站制作公司有哪些,pi商城官网是哪个?  JavaScript中的标签模板是什么_它如何扩展字符串功能  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Python图片处理进阶教程_Pillow滤镜与图像增强  简历没回改:利用AI润色让你的文字更专业  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何快速生成橙子建站落地页链接?  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何在阿里云完成域名注册与建站?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何用PHP快速搭建CMS系统?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  网站制作大概多少钱一个,做一个平台网站大概多少钱?  js实现点击每个li节点,都弹出其文本值及修改  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel如何与Pusher实现实时通信?(WebSocket示例)  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  详解Android——蓝牙技术 带你实现终端间数据传输  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】