SpringBoot 集成cas认证

SpringBoot 集成cas认证之前一篇介绍了 cas 认证服务的整个流程 这篇文章 Springboot 框架里面如何整合 cas 实现整个认证的流程 1 gt 首先引入 Springsecuri 的依赖 jarcompile org springframew security spring security cas 2 gt 配置 CasSecurityC 类 Configuratio

之前一篇介绍了cas认证服务的整个流程;这篇文章Springboot框架里面如何整合cas实现整个认证的流程;

1>首先引入Springsecurity cas的依赖jar

compile "org.springframework.security:spring-security-cas"

2>配置CasSecurityConfig类

@Configuration public class CasSecurityConfig { @Value("${cas.server.url}") private String casServerUrl; @Value("${cas.service.home}") private String serverHome; @Value("${cas.service.backEndService}") private String backEndService; @Value("${cas.server.prefix}") private String casServerUrlPrefix; @Autowired private CustomCasUserDetailsService customCasUserDetailsService; @Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService(backEndService + "/login/cas"); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean @Primary public AuthenticationEntryPoint authenticationEntryPoint( ServiceProperties sP) { CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); //cas登录服务 entryPoint.setLoginUrl(casServerUrl + "/cas/login"); entryPoint.setServiceProperties(sP); return entryPoint; } @Bean public TicketValidator ticketValidator() { return cas30ProxyTicketValidator(); } TicketValidator cas30ProxyTicketValidator() { // 是否开启代理 Cas30ProxyTicketValidator cas30ProxyTicketValidator = new Cas30ProxyTicketValidator(casServerUrlPrefix); cas30ProxyTicketValidator.setProxyGrantingTicketStorage(new ProxyGrantingTicketStorageImpl()); cas30ProxyTicketValidator.setAcceptAnyProxy(true); cas30ProxyTicketValidator.setURLConnectionFactory(new SophonHttpsURLConnectionFactory()); return cas30ProxyTicketValidator; } @Bean public CasAuthenticationProvider casAuthenticationProvider() { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties()); provider.setTicketValidator(ticketValidator()); provider.setAuthenticationUserDetailsService(customCasUserDetailsService); provider.setKey("an_id_for_this_auth_provider_only"); return provider; } @Bean public SecurityContextLogoutHandler securityContextLogoutHandler() { return new SecurityContextLogoutHandler(); } @Bean public LogoutFilter logoutFilter() { //退出后转发路径 LogoutFilter logoutFilter = new LogoutFilter( casServerUrl + "/cas/logout?service=" + serverHome, securityContextLogoutHandler()); logoutFilter.setLogoutRequestMatcher(new AntPathRequestMatcher("/api/logout")); return logoutFilter; } @Bean public SingleSignOutFilter singleSignOutFilter() { //单点退出 SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); singleSignOutFilter.setCasServerUrlPrefix(casServerUrlPrefix); singleSignOutFilter.setIgnoreInitConfiguration(true); return singleSignOutFilter; } //设置退出监听 @EventListener public SingleSignOutHttpSessionListener singleSignOutHttpSessionListener( HttpSessionEvent event) { return new SingleSignOutHttpSessionListener(); } }

1)ServiceProperties配置了认证成功之后跳转的地址,cas在认证成功之后返回这个地址,并携带ticket;所以注意这个地址在springSecurity中一定是permitAll;不然会出现死循环;这里默认就使用这个地址”/login/cas”,不然会有问题,后面会详细说;

2)AuthenticationEntryPoint配置了cas认证服务器的地址;

3)TicketValidator配置了校验ticket的类,应用接收到ticket之后,会通过这个类向cas认证服务器发送校验的请求校验ticket的有效性;

4)CasAuthenticationProvider 包含了校验ticket的配置以及校验成功之后获取用户信息的配置;这里配置的是CustomCasUserDetailsService

5)casServerUrlPrefix是cas的前缀地址,比如https://gg-sophon-13:8393/cas;

3>添加配置

在SecurityConfiguration中添加cas的过滤器,如图所示

SpringBoot 集成cas认证

同时添加如下配置bean

@Override protected AuthenticationManager authenticationManager(){ //设置cas认证提供 return new ProviderManager( Arrays.asList(authenticationProvider)); } @Bean public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties sp) { //cas认证过滤器,当触发本filter时,对ticket进行认证 CasAuthenticationFilter filter = new CasAuthenticationFilter(); filter.setServiceProperties(sp); filter.setAuthenticationManager(authenticationManager()); filter.setAuthenticationSuccessHandler(new CasAuthenticationSuccessHandler()); return filter; }

整个配置到这里基本就结束了,下面跟踪下源码,解释下自己的两个疑问:

1.为什么serviceProperties.setService的地址后缀要是”/login/cas”?我改成其他的行不行,比如”/login/cas123″

2.具体校验ticket的逻辑是怎么处理的;

4>疑问解释

1)我把地址改成了”/login/cas123″

结果如图所示

SpringBoot 集成cas认证

SpringBoot 集成cas认证

那么为什么地址是”/login/cas”的时候就可以成功解析到ticket,然后去处理,改成”/login/cas123″就不行了那?带着疑问我断点调试了源代码发现

SpringBoot 集成cas认证

这里的返回值是ture,所以不需要认证,然后又没有一个接口或者页面对应就404了;跟踪进去这里的requiresAuthentication所做的操作

SpringBoot 集成cas认证

这里的match匹配的url是”/login/cas”,而我们的request的地址是”/login/cas123″,当然不匹配了;那么这个match中的地址是在哪里设置的那,我们看下AbstractAuthenticationProcessingFilter的子类CasAuthenticationFilter

SpringBoot 集成cas认证

在构造的时候默认这个地址就是”/login/cas”;第一个问题解决了

2)第二个疑问,ticket拿到之后怎么处理的,这个是封装的,但是还是想看一下具体的逻辑;

跟踪到父类具体逻辑应该在这里

AbstractUrlBasedTicketValidator这个类里面

SpringBoot 集成cas认证

构造个ticket的url,根据cas的协议去校验,这个url地址是

https://gg-sophon-13:8393/cas/p3/proxyValidate?ticket=ST-218-ckNP-WOYieH2dg4dLZp2FUiw-xE-gg-sophon-13&service=http%3A%2F%2Flocalhost%3A8080%2Flogin%2Fcas

p3/proxyValidate 是api地址,应该是根据不同的cas协议,这个地址也是固定的,后面追加上ticket以及service地址;

验证完ticket之后,cas认证服务器返回用户的信息,以map的方式进行村粗;如图所示

SpringBoot 集成cas认证

然后调用我们之前定义的CustomCasUserDetailsService类loadUserDetails方法解析用户信息,之后存储在session中;

SpringBoot 集成cas认证

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220881.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:27
下一篇 2026年3月17日 下午7:27


相关推荐

  • Catalan 数

    Catalan 数简介卡特兰数又称卡塔兰数 英文名 Catalannumbe 1 1 2 5 14 42 132 429 1430 4862 16796 58786 3

    2026年3月17日
    3
  • Bash Export命令「建议收藏」

    Bash Export命令「建议收藏」一.shell和export《1》用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,脚本shell将终止,返回…

    2025年9月28日
    4
  • MyBatis 多表联合查询及优化

    MyBatis 多表联合查询及优化序这篇文章我打算来简单的谈谈mybatis的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟mybatis这东西现在是个开发的都会用,而且网上的文章也是一搜罗一大堆,根本就用不着我来重复。但是吧,就我前几天在做一个多表联合查询的时候,竟然出了很多意想不到的问题,而且这些问题的出现,并不是对mybatis不了解,而是在用的过程中会或多或少的忽略一些东西,导致提示各种错误

    2022年4月30日
    42
  • actionchains selenium_Selenium ActionChains、TouchAction方法

    actionchains selenium_Selenium ActionChains、TouchAction方法ActionChains 和 TouchAction 可以用来模拟点击 双击 滑动等事件 ActionChains 用于执行 PC 端的鼠标移动 按键 拖拽等事件 TouchActions 用法与 ActionChains 类似 可以用来模拟 PC 和移动端的 ActionChains 和 TouchAction 可以用来模拟点击 双击 滑动等事件 ActionChains 用于执行 PC 端的鼠标移动 按键 拖拽等事件 Touch

    2026年3月18日
    3
  • 通过Adblock关闭网站上百度分享的方法「建议收藏」

    通过Adblock关闭网站上百度分享的方法「建议收藏」在七禾网站上,只要左键选中一段文字,就会蹦出个百度分享,导致针对选中文字的右键操作,比如qq浏览器中的收藏选中文字功能无法正常工作(原因是百度分享先弹出后抢了焦点,再点右键后选中的文字被取消选中了),试了各种浏览器设置方法都去不掉这个烦人的百度分享弹屏。看了网页代码,是嵌入的如下代码在作梗:<script>window._bd_share_config={…

    2022年10月8日
    5
  • HTML空格标记_html换行标记

    HTML空格标记_html换行标记HTML6种空格标记HTML提供了5种空格实体(spaceentity),它们拥有不同的宽度,非断行空格( )是常规空格的宽度,可运行于所有主流浏览器。其他几种空格(   ‌‍)在不同浏览器中宽度各异。 它叫不换行空格,全称No-BreakSpace,它是最常见和我们使用最多的空格,大多数的人可能只接触了 ,它是按下space键产生的空格。在HTM

    2026年4月15日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号