Spring Security OAuth过期的解决方法
最近一段时间,大家在用SpringSecurityOAuth2时可能发现有很多类过期了。
大家在选择OAuth2依赖的时候,可能也会困惑,有好几个地方都可以选:
那么到底选择哪一个依赖合适呢?这不同的依赖又有什么区别?今天松哥就来和大家聊一聊SpringSecurity中关于OAuth2的恩怨。
前言
先来大致介绍一下OAuth2在Spring框架中的发展历程。
大约十年前,Spring引入了一个社区驱动的开源项目SpringSecurityOAuth,并将其纳入Spring项目组合中。到今天,它已经发展成为一个成熟的项目,可以支持大部分OAuth规范,包括资源服务器、客户端和授权服务器等。
现在它已成为UAA(UserAccountandAuthenticationServer)的基础。SpringSecurityOAuth项目已成为一个样板项目,它证明了Spring社区可以出色的完成工作。
然而早期的项目存在这样一些问题:
- OAuth是在很早的时候完成的,开发者无法预料未来的变化以及这些代码到底要被怎么用,导致很多Spring项目提供了自己的OAuth支持,这就带来了OAuth2支持的碎片化。
- 最早的OAuth项目同时支持OAuth1.0和OAuth2.0,现在OAuth1.0早已经不再使用,可以放弃了
- 现在我们有更多的库可以选择,可以在这些库的基础上去开发,以便更好的支持JWT等新玩意。
基于以上这些原因,官方决定在社区成功的基础上,重写SpringSecurityOAuth,以更好地协调Spring和OAuth,并简化代码库,以使Spring的OAuth支持更加灵活。
然而,在重写的过程中,发生了不少波折。
2018.01.30
事情得从2018年1月30号讲起。
那天Spring官方发了一个通知,说是要逐渐停止现有的OAuth2支持,而在SpringSecurity5中构建下一代OAuth2.0支持。
为什么要这样呢?
大家知道,OAuth2只是一种协议,Spring框架通过代码对这种协议进行落地。
当时OAuth2的落地方案比较混乱(这种混乱到今天依然存在),在SpringSecurityOAuth、SpringCloudSecurity、SpringBoot1.5.x以及当时最新的SpringSecurity5.x中都提供了对OAuth2的实现。
以至于当开发者需要使用OAuth2时,不得不问,到底选哪一个依赖合适呢?已经有三个地方提供了OAuth2的支持,已经够混乱了,为什么还要在最新的SpringSecurity5.x中继续提供实现呢?
太乱了!
所以Spring官方决定有必要将OAuth2.0的支持统一到一个项目中,以便为用户提供明确的选择并避免任何潜在的混乱,同时OAuth2的开发文档也要重新编写,以方便开发人员学习。所有的决定将在SpringSecurity5中开始,构建下一代OAuth2.0的支持。
从那个时候起,SpringSecurityOAuth项目就正式处于维护模式。官方将提供至少1年的错误/安全修复程序,并且会考虑添加次要功能,但不会添加主要功能。同时将SpringSecurityOAuth中的所有功能重构到SpringSecurity5.x中。
老实说,这是一个英明的决定,当时并没有引起太多的反响。但是接下来的事情就不是那么顺利了。
2019.11.14
时间到了2019.11.14。
这天,官方又发了个通知。
先说了SpringSecurityOAuth在迁往SpringSecurity5.x的过程非常顺利,大部分迁移工作已经完成了,剩下的将在5.3版本中完成迁移,在迁移的过程中还添加了许多新功能,包括对OpenIDConnect1.0的支持
接下来话锋一转,说了一件很多人难以接受的事情,那就是将不再提供对授权服务器的支持(要是小伙伴们不懂什么是授权服务器,可以在公众号江南一点雨后台回复OAuth2,有松哥写的OAuth2教程)。
不提供的原因,官方给了两个:
在2019年,将有大量的商业和开源授权服务器可用。授权服务器是使用一个库来构建产品,而SpringSecurity作为框架,并不适合做这件事情。
一石激起千层浪,许多开发者表示对此难以接受。这件事也在Spring社区引发了激烈的讨论,好在Spring官方愿意倾听来自社区的声音。
2020.04.15
这天,官方又发了个通知。
这次宣布了SpringAuthorizationServer项目。这是一个由SpringSecurity团队领导的社区驱动的项目,致力于向Spring社区提供AuthorizationServer支持。
官方倾听了来自社区的声音,决定继续提供授权服务器。
这次只是宣布了一下,算是安抚了一下社区的情绪,但是项目还没开发出来。
2020.08.21
SpringAuthorizationServer0.0.1正式发布!
同时公布了项目源码地址:https://github.com/spring-projects-experimental/spring-authorization-server
在这个版本中,主要提供了如下功能:
- OAuth2.0授权代码授予 -RFC6749
- OAuth2.0客户端凭据授予 -RFC6749
- JSONWeb令牌(JWT) -RFC7519
- JSONWeb签名(JWS) -RFC7515
- JSONWeb密钥(JWK) -RFC7517
- 密钥管理,用于在签署JWT(JWS)时提供密钥
其他功能还在紧锣密鼓的开发中。
这就是OAuth2最近几年的变更之路。
回到问题
回到最开始的问题。
类过期了怎么办?
类过期是因为旧的写法已经不被支持,松哥举个简单例子,以前我们定义资源服务器是这样的:
@Configuration @EnableResourceServer publicclassResourceServerConfigextendsResourceServerConfigurerAdapter{ @Bean RemoteTokenServicestokenServices(){ RemoteTokenServicesservices=newRemoteTokenServices(); services.setCheckTokenEndpointUrl("http://localhost:8080/oauth/check_token"); services.setClientId("javaboy"); services.setClientSecret("123"); returnservices; } @Override publicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{ resources.resourceId("res1").tokenServices(tokenServices()); } @Override publicvoidconfigure(HttpSecurityhttp)throwsException{ http.authorizeRequests() .antMatchers("/admin/**").hasRole("admin") .anyRequest().authenticated(); } }
现在迁移到SpringSecurity5.x中之后,我们是这样定义的:
@Configuration publicclassMyResourceServerextendsWebSecurityConfigurerAdapter{ @Override protectedvoidconfigure(HttpSecurityhttp)throwsException{ http.authorizeRequests() .anyRequest().authenticated() .and() .oauth2ResourceServer() .opaqueToken() .introspectionUri("http://localhost:8080/oauth/check_token") .introspectionClientCredentials("javaboy","123"); } }
这两段代码作用是一样的。后面的是目前最新写法,不存在过期的问题。
选哪个依赖
现在大家已经知道为什么会存在多种不同的依赖,SpringCloudSecurityOAuth2中使用旧的写法并不会提示过期,但是它同时也支持新的写法,建议小伙伴们用新的写法,反正迟早都要改过来。
到此这篇关于SpringSecurityOAuth过期的解决方法的文章就介绍到这了,更多相关SpringSecurityOAuth过期内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。