
Spring Security与OAuth2
图文并茂、通俗易懂、层层递进、贴近实战,保姆级Spring Security OAuth2教程,包含了最新的Spring Security 5.6和Spring Authorization Server。预计50篇左右,持续更新中……
码农小胖哥
资深架构师,Spring Authorization Server Contributor
展开
-
差不多10天没有更文,OAuth2教程已经进入后半段
差不多10天没有更文了,胖哥最近在写OAuth2相关的干货教程。说实话我大意了,OAuth2的东西真是太多了,不是一般的多,RFC文档就20多个,还有很多词条概念都相当抽象。我也陷入这个迷...原创 2022-03-14 07:30:00 · 2518 阅读 · 13 评论 -
1-Spring Security OAuth2专栏介绍
我自己我是码农小胖哥,一名后端软件工程师,有多年的后端开发经验,同时也是一名热衷于技术分享、拥抱开源的技术博主。我的技术栈主要是Java、Python、Kotlin,欢迎各位同行进行交流和分享。个人技术公众号:码农小胖哥个人博客:https://felord.cnGitee: https://gitee.com/felord你可以通过以上方式和我交流、解决学习中的疑难杂症。2021年开源Spring Security 干货系列教程,2022年又开源Spring Security进阶版,帮原创 2022-03-16 21:16:01 · 5440 阅读 · 2 评论 -
2-直观体验OAuth2
OAuth2是近些年来非常火热的授权协议,在开发中使用的也越来越多,经常用来实现三方授权和SSO(单点登录)。不过它也非常复杂,迭代也非常快,目前OAuth协议已经进化到了OAuth 2.1。Spring Security对OAuth2也提供了支持,我们先通过一个例子来直观地感受一下,这将非常有利于我们后面的学习。https://gitee.com/felord/spring-security-oauth2-tutorial master 分支。OAuth2例子说明这里我们将通过Sprin原创 2022-03-16 21:35:01 · 3563 阅读 · 24 评论 -
3-OAuth2登录流程分析
在上一篇胖哥和大家共同体验了OAuth2登录流程,直观感受了OAuth2,本篇我们来共同分析一下OAuth2登录的流程,本次分析将严重依赖trace日志。流程分析①访问被拒绝/foo/hello发起请求后会经过一系列过滤器链的过滤触发访问被拒绝,核心的日志如下:进入HTTP资源安全处理过滤器FilterSecurityInterceptor。发现本次/foo/hello请求是一个匿名请求。而实际上/foo/hello需要非匿名认证。访问决策投票器WebExpressionVoter做出了拒原创 2022-03-16 21:45:12 · 3636 阅读 · 0 评论 -
4-OAuth2.0协议简单认识
上一篇胖哥和大家一起通过日志分析了Spring Security OAuth2的authorization_code模式,相信流程你已经了解了一些。但是你会不会有这样的疑问,用户访问客户端自己的资源/foo/hello为啥还要跳到第三方gitee登录?正常情况下自己的资源只要自己认证就能访问,借助于其它平台认证授权是怎么回事?解惑Spring Security OAuth2 Login纯粹是“借别人的鸡下自己的蛋”。真正的目的是授权去访问/v5/user获得gitee平台当前用户的信息,借第三方平台的用原创 2022-03-16 22:05:21 · 7026 阅读 · 12 评论 -
5-OAuth2.1的已知变动
OAuth2.0现在越来越流行了,特别在微服务大行其道的情况下。不过OAuth2.0太老了, 最初的OAuth2.0规范于 2012 年 10 月以RFC 6749文档为蓝本发布,取代了 2010 年 4 月发布的 OAuth1.0,在发布OAuth2.0的时候,Vue、React还没有兴起,甚至连跨域资源共享CORS还不是正式的W3C标准。OAuth2.0面对如今飞速发展的移动互联网已经老态龙钟,跟不上时代了。好在OAuth2.0非常开放,开发者可以做很多自定义操作,它把很多“设计权限”下放给了开发者,经原创 2022-03-16 22:13:08 · 2234 阅读 · 2 评论 -
6-Spring Security OAuth2配置项详解
我们在配置文件中进行了一些配置就完成了第三方OAuth2登录,这些配置项都是啥?配置文件中的gitee配置项是如何写入配置生效的呢?初学者的可能会有点懵逼。本篇将把这个疑问解决掉。OAuth2配置项的读取以下是Spring Boot配置文件的配置项示例:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QN6Ba2B3-1647440314790)(.\img\application-oauth2.png)]上图在application.yml中配置的OAuth2信息会被原创 2022-03-16 22:25:26 · 3559 阅读 · 8 评论 -
7-OAuth2AuthorizationRequestRedirectFilter
在3-OAuth2登录流程分析一文中我们分析定位到OAuth2AuthorizationRequestRedirectFilter是OAuth2授权环节中一个重要的过滤器,今天我们来研究一下它的细节部分。OAuth2AuthorizationRequestRedirectFilter该过滤器是Spring Security的内置过滤器,它负责将最终用户(End User)发起的请求/oauth2/authorization/gitee重定向到授权服务器的授权端点(authorization uri)来启原创 2022-03-16 22:30:25 · 2134 阅读 · 0 评论 -
8-OAuth2LoginAuthenticationFilter
当gitee收到OAuth2授权请求后,会向浏览器发出302重定向到redirect_uri的响应。由于默认情况下回调的路径满足/login/oauth2/code/*,该路径会被OAuth2LoginAuthenticationFilter过滤器拦截处理。本篇就对该过滤器执行的细节进行一个分析。OAuth2LoginAuthenticationFilter该类的思维导图如下:OAuth2登录认证逻辑OAuth2LoginAuthenticationFilter的核心都在attemptAuthen原创 2022-03-16 22:37:02 · 2086 阅读 · 13 评论 -
9-Spring Boot中OAuth2的自动配置
在Gitee OAuth2登录演示中,我们仅仅进行了一些配置就实现了OAuth2登录,如此简单的方式得益于Spring Boot的自动化配置。前面已经把OAuth2相关的配置项进行了讲解说明,本篇我们也来看看Spring Boot对OAuth2进行了哪些自动化默认配置。默认配置都是可以改写的!自动配置结构Spring Boot中关于OAuth2的自动化配置在spring-boot-autoconfigure依赖下的org.springframework.boot.autoconfigure.sec原创 2022-03-16 22:50:50 · 1693 阅读 · 2 评论 -
10-微信OAuth2授权登录
前面已经把gitee的OAuth2授权登录流程和配置搞明白了,单纯的理论十分枯燥,而且gitee的OAuth2中规中矩,需要我们定制的东西不多。因此这里结合微信网页开发文档来实现微信环境下的网页OAuth2授权。微信网页授权对OAuth2的一些地方进行了“夹带私货”,属于非标准的OAuth2,很多地方需要定制。这不仅仅是一个挑战,还是学习Spring Security OAuth2的一个良好素材,而且比较爽的是它提供沙盒。本文DEMO:https://gitee.com/felord/spring-se原创 2022-03-16 22:55:55 · 2569 阅读 · 17 评论 -
11-OAuth2登录的配置逻辑
Spring Boot中和OAuth2的默认配置梳理过了,里面有很多新概念。对于初学者可能不太好接受,今天我们深入Spring Security OAuth2登录的配置细节。以下是HttpSecurity配置OAuth2登录的入口方法: public OAuth2LoginConfigurer<HttpSecurity> oauth2Login() throws Exception { return getOrApply(new OAuth2LoginConfigurer<>原创 2022-03-16 23:14:08 · 1431 阅读 · 0 评论 -
12-OAuth2LoginConfigurer的初始化
OAuth2LoginConfigurer的初始化方法对于深入了解Spring Security OAuth2登录功能十分重要,本篇我将来深入解读它的初始化方法init的逻辑。init方法先来看init方法。它干了5件事:初始化OAuth2LoginAuthenticationFilterOAuth2LoginAuthenticationFilter构造有三个参数,参数来源优先级如下图:初始化完毕后通过setAuthenticationFilter方法设置,并没有加入过滤器链中。也就是说该过滤原创 2022-03-17 00:00:22 · 1044 阅读 · 0 评论 -
13-OAuth2LoginConfigurer的配置
上一篇把OAuth2LoginConfigurer的初始化过程进行了解析,本篇接着来搞清楚OAuth2LoginConfigurer的配置过程。configure方法configure方法只干了3件事:初始化并配置OAuth2AuthorizationRequestRedirectFilterOAuth2AuthorizationRequestRedirectFilter的初始化和配置在configure阶段完成,并在完成配置后通过HttpSecurity.addFilter方法加入过滤器链。初原创 2022-03-17 00:08:20 · 1061 阅读 · 0 评论 -
14-OAuth2ClientConfigurer
OAuth2 Login讲完了,还有一个OAuth2ClientConfigurer,它是HttpSecurity.oauth2Client()配置的底层逻辑,今天顺带花时间搞明白它。本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial oauth2client 分支。OAuth2 Client 与 OAuth2 LoginOAuth2 Login都是OAuth2授权码授权模式的流程。但是它们也有不一样的地方:O原创 2022-03-17 00:26:22 · 1024 阅读 · 2 评论 -
15-JOSE规范
移动端兴起和OAuth2的流行导致JWT这几年火得一塌糊涂。今天要介绍另一个规范集JOSE,全称Javascript Object Signing and Encryption,它和JWT有莫大的关系。JOSE简介JOSE是一个Javascript对象签名和加密协议,目的是提供一种在各个通讯方之间安全传输声明( claims,例如授权信息 )的方法,它特意构建在JSON和BASE64之上,以便在 Web应用程序中轻松使用。 目前该规范还在不断地发展,我们常用的包含以下几个由RFC文档定义的概念:J原创 2022-03-17 00:44:57 · 1304 阅读 · 2 评论 -
16-Spring Security中的JOSE类库
前面对JOSE规范进行了科普,今天我们来实践一波。Java庞大的生态圈自然也少不了对JOSE的支持。本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial jose 分支。Nimbus-JOSE-JWT很多教程会使用jjwt作为JWT的集成类库,它很精湛,对于JWT应该是够用了。但是如果要结合OAuth2的话,它远远不够。这里我推荐使用connect2id开源的nimbus-jose-jwt,功能齐全,API友好。更重原创 2022-03-17 00:51:34 · 2078 阅读 · 9 评论 -
17-什么是资源服务器
Resource Server又称作资源服务器,它是OAuth2中的一个重要概念。这个概念并不容易理解。什么是资源服务器以下摘自RFC文档对资源服务器的描述:The server hosting the protected resources, capable of accepting and responding to protected resource requests using access tokens.托管受保护的资源,并且有使用Access Token来接受和响应对受保护资源的访原创 2022-03-17 00:59:24 · 2423 阅读 · 0 评论 -
18-Spring Security中的资源服务器
我在上一篇对资源服务器进行了简单的阐述,让大家对资源服务器的概念有了简单的认识,今天我们将对Spring Security中的Resource Server支持进行一个深入了解和使用。本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial resourceserver 分支。Spring Security集成资源服务器和集成OAuth2 Client一样 ,资源服务器的集成只要额外的在Spring Security的基原创 2022-03-17 01:07:00 · 1420 阅读 · 0 评论 -
19-Spring Security资源服务器配置详解
我们已经初步尝试了资源服务器,我个人感觉资源服务器就像火车站进站口,你带着票进站乘车,售票员或者闸机就是那个过滤器(Filter),对你的票进行检验核对,符合了就放你进站,不符合了就按规定处理。那这一切是如何发生的呢?今天我们深入细节底层来看看一探究竟。OAuth2ResourceServerConfigurer通过HttpSecurity.oauth2ResourceServer很容易找出来Resource Server的配置类OAuth2ResourceServerConfigurer。下面的思维导原创 2022-03-17 01:16:17 · 2563 阅读 · 0 评论 -
20-BearerTokenAuthenticationFilter
BearerTokenAuthenticationFilter是Spring Security资源服务器的核心过滤器。负责对请求中携带的Token进行校验,提取认证信息,以确定当前请求是否有权限访问对应的资源。BearerTokenAuthenticationFilter以下是BearerTokenAuthenticationFilter的大致结构:成员属性都在上一文中进行了说明,这里就不再赘述了。核心逻辑作为一个OncePerRequestFilter核心的逻辑还在doFilterIntern原创 2022-03-17 01:21:07 · 1903 阅读 · 4 评论 -
21-Spring Authorization Server介绍
从今天起我们来搞一搞Spring新项目Spring Authorization Server,我们先来看看项目背景,了解这个有助于你了解项目的意图和场景。项目背景2019年11月下旬,Spring官方在Spring Security OAuth 2.0路线图中 指出2.3.x版本将在2020年3月到达项目生命周期的终点(End Of Life),随后将会发布2.4.x和2.5.x。 后续2.4.x和2.5.x补丁和安全修复程序支持将持续到2021年5月,另外2.5.x的安全修复支持将持续到2022年5月原创 2022-03-17 11:49:20 · 3231 阅读 · 3 评论 -
22-Spring Authorization Server初体验
在上一篇中我对授权服务器项目Spring Authorization Server进行了介绍,这一篇我们来一起看看它是如何搭建、如何使用。先不要纠结为什么要这样配置,先跑起来,后面会去深入探究原因。本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial springauthserver 分支。项目环境依赖本文Spring Authorization Server版本为0.2.2。像OAuth2 Client、Re原创 2022-03-17 15:33:59 · 3404 阅读 · 12 评论 -
23-Spring Authorization Server结合客户端
Spring Authorization Server的服务器已经在上一篇中搭建好了,并注册了一个OAuth2客户端,本篇将利用这个注册的客户端实现HttpSecurity.oauth2Client功能。本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial springauthserver 分支。授权服务器补充配置上一篇搭建Spring Authorization Server授权服务器如果想投入使用,还要做一个配置原创 2022-03-18 11:12:37 · 1945 阅读 · 21 评论 -
24-Spring Authorization Server执行日志分析
OAuth2客户端授权码执行流程我们在前面的教程中已经花费了大量的篇幅来学习,但是相关OAuth2授权服务器的执行细节却不得而知,Spring Authorization Server的出现使得分析这一过程称为可能。授权服务器处理客户端授权请求流程客户端通过/oauth2/authorize向授权服务器发起了授权请求,这期间发生了什么?通过日志我们来看一个究竟。这里分为两个阶段:用户登录之前下面是授权服务器收到授权请求处理并跳转到登录/login前的日志:日志中标记了四个关键点:①授权服务器原创 2022-03-18 14:24:04 · 1463 阅读 · 5 评论 -
25-Spring Authorization Server的配置总览
如果你在学习中遇到问题,可以留言,也可以联系我。上一篇我们一起分析了Spring Authorization Server的请求日志,本篇我们来对Spring Authorization Server的配置进行一个解读。Spring Authorization Server的配置目前Spring Authorization Server的配置在不停的优化,有些细节部分可能在未来有所变动。其实默认情况下Spring Authorization Server提供了一个配置类OAuth2Autho.原创 2022-03-19 18:41:15 · 2065 阅读 · 0 评论 -
26-ProviderContextFilter
从今天起,我们进入Spring Authorization Server过滤器及其配置的相关学习。先从由OAuth2AuthorizationServerConfigurer直接配置的过滤器开始,本篇为ProviderContextFilter。ProviderContextFilterProviderContextFilter直接由OAuth2AuthorizationServerConfigurer进行配置,ProviderContextFilter的唯一非空构造参数是ProviderSetting原创 2022-03-20 12:13:04 · 870 阅读 · 0 评论 -
27-令牌自省OAuth2TokenIntrospectionEndpointFilter
OAuth2TokenIntrospectionEndpointFilter同样直接由OAuth2AuthorizationServerConfigurer进行配置,负责令牌自省,在OAuth2中这个功能是提供给Resource Server做令牌校验用的。对于Resource Server来说令牌自省不是一个必须的功能。今天我们来简单研究一下这个过滤器。OAuth2TokenIntrospectionEndpointFilterOAuth2TokenIntrospectionEndpointFilte原创 2022-03-21 14:29:22 · 5174 阅读 · 0 评论 -
28-JWKSet公钥令牌端点过滤器
NimbusJwkSetEndpointFilter这个过滤器直接由OAuth2AuthorizationServerConfigurer进行配置,负责处理JWKSet(请回顾前面JOSE相关的文章)端点的逻辑。这个应该是Spring Authorization Server目前最简单的过滤器,底层依赖nimbus-jose类库,顾名思义。NimbusJwkSetEndpointFilter该过滤器构造方法需要两个参数JWKSource<SecurityContext>和JWKSet端点UR原创 2022-03-22 11:35:40 · 1734 阅读 · 0 评论 -
29-授权服务器配置信息端点过滤器OAuth2AuthorizationServerMetadataEndpointFilter
OAuth2AuthorizationServerMetadataEndpointFilter是一个对外提供授权服务器元信息的端点,遵循RFC8414相关的规范。由于这个过滤器也非常简单,几乎没有什么可多说的,所以本文着重结合代码讲一下RFC8414规范。RFC8414规范解读该规范的目的是提供一个开放端点方便OAuth2客户端获取授权服务器的一些配置信息、支持信息,以达到自动配置Provider的目的。该规范要求提供一个路径为/.well-known/*的URI,后缀推荐oauth-authoriza原创 2022-03-22 11:39:43 · 1402 阅读 · 0 评论 -
30-OAuth2授权端点配置类
前面分析的几个过滤器都没有自己专属的配置类,Spring Authorization Server剩下的过滤器都有自己专属的配置类。授权端点过滤器OAuth2AuthorizationEndpointFilter的配置类为OAuth2AuthorizationEndpointConfigurer,本篇将深入学习它。OAuth2AuthorizationEndpointConfigurerOAuth2AuthorizationEndpointConfigurer只能由OAuth2Authorization原创 2022-03-23 14:34:48 · 2057 阅读 · 0 评论 -
31-授权服务器如何处理客户端授权请求
我们在上一篇中讲解了OAuth2AuthorizationEndpointConfigurer,它负责配置OAuth2AuthorizationEndpointFilter。今天我们来深入了解OAuth2AuthorizationEndpointFilter。OAuth2AuthorizationEndpointFilter它的配置项都来自配置类OAuth2AuthorizationEndpointConfigurer,已经在上一篇文章中讲解过了,这里着重了解它的流程逻辑。路径匹配规则在这之前我单纯原创 2022-03-24 15:42:47 · 2360 阅读 · 3 评论 -
32-Spring Authorization Server 0.2.3 的变化
很快啊Spring Authorization Server又发新版本了,现在的版本是0.2.3。本次都有什么改动呢?我们来了解一下。0.2.3版本特性本次更新的新特性不少。为公开客户端提供默认的设置根据RFC6479,包含授权码(authorization_code)授权并且客户端认证方式ClientAuthenticationMethod只有一种,为none的客户端都是公开(Public)客户端,反之就是机密(Confidential)客户端。在0.2.3中,为公开的客户端提供了客户端默认配置原创 2022-03-25 18:30:40 · 2045 阅读 · 4 评论 -
33-授权码授权请求的具体逻辑
OAuth2AuthorizationEndpointFilter负责OAuth2AuthorizationCodeRequestAuthenticationToken的组装,而该token的认证默认则有OAuth2AuthorizationCodeRequestAuthenticationProvider负责。按照设计OAuth2AuthorizationCodeRequestAuthenticationToken支持的AuthenticationProvider可以有多个,目前只有一个。OAut原创 2022-03-28 15:05:05 · 1216 阅读 · 2 评论 -
34-自定义OAuth2授权确认页面
本文DEMO:https://gitee.com/felord/spring-security-oauth2-tutorial customconsent 分支。在OAuth2AuthorizationEndpointFilter的流程分析中我们针对用户授权(consent)确认302重定向默认情况下由一个自动生成的页面承担。而大多数情况下我们希望能够自定义用户确认页面。以下是自定义用户确认授权URI的代码:String redirectUri = UriComponentsBuilder..原创 2022-03-29 15:04:18 · 1990 阅读 · 5 评论 -
35-OAuth2授权服务器客户端认证配置
本篇我们来对另一个配置类OAuth2ClientAuthenticationConfigurer进行了解,从名字上看它被成为OAuth2客户端认证配置。啥?OAuth2客户端还需要认证吗?当然需要!OAuth2 客户端类型根据RFC6749#section-2.1的描述,OAuth2基于客户端保护自己密码的能力定义了两种客户端类型:confidential机密型客户端,这种OAuth2客户端有能力保护自己的client-secret,不会泄露出去并能安全地使用它。大部分承担了OAuth2客户端的后端原创 2022-03-31 14:43:37 · 2091 阅读 · 3 评论 -
36-OAuth2客户端认证过滤器详解
本篇来深入学习OAuth2ClientAuthenticationFilter,来看看OAuth2客户端是如何进行认证的。至于客户端为什么要认证,请仔细阅读OAuth2ClientAuthenticationConfigurer中相关的章节。OAuth2ClientAuthenticationFilter下面是它的过滤器逻辑:根据上面图示的步骤,我们来看下流程:①先进行路径匹配,要符合OAuth2ClientAuthenticationConfigurer中分析的路径匹配规则。②通过转换器Au原创 2022-04-01 15:34:27 · 2862 阅读 · 8 评论 -
37-Spring Authorization Server利用JWT对OAuth2客户端进行认证(国内首发)
本篇开始基于Spring Authorization Server 0.2.3。在的OAuth2ClientAuthenticationFilter讲述中我们知道JwtClientAssertionAuthenticationConverter是用来从HttpServletRequest中提取两种OAuth2客户端断言认证方式private_key_jwt和client_secret_jwt的认证信息并封装为OAuth2ClientAuthenticationToken。OAuth2ClientAut.原创 2022-04-04 21:04:59 · 2789 阅读 · 2 评论 -
38-OAuth2客户端认证方式private_key_jwt的Java实现
上一篇对Spring Authorization Server利用JWT认证OAuth2客户端的逻辑进行了分析,本篇我们将对private_key_jwt类型的认证方式进行实战练习。private_key_jwt客户端认证关于private_key_jwt客户端认证,在我相关的文章中已经多次提及和讲述,基于篇幅的原因这里不再赘述。不过还要提一下,这种认证方式的作用就是让OAuth2客户端认证更加安全,它摒弃了传统的密码认证机制,充分利用了JWT可以携带元信息的能力。接下来我们来看看Spring Aut原创 2022-04-06 09:46:08 · 1475 阅读 · 6 评论 -
39-Spring Authorization Server实现client_secret_jwt客户端认证
上一篇对Spring Authorization Server利用JWT认证OAuth2客户端的逻辑进行了分析,本篇我们将对private_key_jwt类型的认证方式进行实战练习。private_key_jwt客户端认证关于private_key_jwt客户端认证,在我相关的文章中已经多次提及和讲述,基于篇幅的原因这里不再赘述。不过还要提一下,这种认证方式的作用就是让OAuth2客户端认证更加安全,它摒弃了传统的密码认证机制,充分利用了JWT可以携带元信息的能力。接下来我们来看看Spring Aut原创 2022-04-10 15:10:56 · 1783 阅读 · 10 评论