springSecurityOAuth核心源码解析

IMG_256

绿色的代表类,蓝色的代表接口,括号中为真正实现类

TokenEndpoint

  整个流程入口点,可以理解成controller,它会处理令牌请求。

  用授权码模式、密码模式时候,请求的url都是一致的,他是通过grant_type来告知我们使用的是哪种请求模式。他处理/oauth/token请求。当收到令牌请求时候,TokenEndPoint会调用我们的ClientDetailsService

ClentDetailsService

  读取第三方应用信息。

  ClientDetailsService区别于UserDetailsService;UserDetailsService是读取用户信息的(查询数据库),ClientDetailsService用来读取第三方应用信息的。

  发送请求时在Header(或Authonzation :TYPE: Basic Auth; username: client_id; password: client_secret)里面都会携带clientId和clientSecret来告诉是哪个应用请求授权,这个ClientDetailsService就会根据传过来的clientId和clientSecret读取响应的client配置信息。这些配置信息都会读取到ClientDetails这个对象里面去。

ClientDetails

  这里面封装的是第三方应用的信息,然后TokenEndpoint还会创建一个TokenRequest对象。

TokenRequest

  封装了提交的参数信息,ClentDetails也封装其中

TokenGranter

  令牌授权者,找到一个授权模式(grant_type)进行处理 都会产出两个对象

  封装了我们请求的其他参数信息,比如:grant_type;如果是密码模式的话,我们的用户名、密码是什么?同时也会把ClientDetails信息放到TokenRequest里面去。因为第三方应用信息 也是令牌请求一部分。利用TokenRequest会去调用我们的TokenGranter(令牌授权者)接口,这个接口后面其实封装了我们的4种授权模式的不同实现。这个接口里面会根据你接口传上来的grant_type去挑选一个自己的实现去执行令牌的生成。不管是哪种实现,生成过程中都会产生2种东西:OAuth2Request和Authentication。

OAuth2Request

  处理之后的新对象(TokenRequest +ClentDetails)的整合对象.

  ClientDetails和TokenRequest信息的整合

Authentication

  谁在授权的信息,对应用户信息(根据提交的信息查询到的用户信息,不同的模式获取的用户信息不同)

  封装了当前授权用户的一些信息。谁在做一些授权,授权用户信息就是在Authentication接口里面。它里面的信息是我们通过UserDetailsService读出来的。

OAuth2Authentication

  哪一个用户在对哪一个应用进行授权,授权模式,授权参数等

  Auth2Request和Authentication整合形成。它里面包含了现在是哪一个第三方应用在请求哪个用户在授权,然后用的授权模式是什么?授权参数是什么等?然后会传递给接口AuthorizationServerTokenServices

AuthorizationServerTokenServices

  认证服务器令牌服务

  拿到我们OAuth2Authentication之后,他会最终生成一个OAuth2AccessToken令牌。AuthorizationServerTokenServices的默认实现的:DefaultTokenServices里面含有两个接口的引用:TokenStore和TokenEnhancer

TokenStore

  处理令牌存储

TokenEnhancer

  令牌生成器,可以对令牌进行改造加强(jwt)

OAuth2AccessToken

  最终的令牌对象

源码追踪

  使用密码模式获取token,相对另外的模式调试起来方便。

  /oauth/token 请求会进入TokenEndpoint类postAccessToken方法

创建tokenRequest,调用TokenGranter接口grant方法,其实现类:CompositeTokenGranter里面

CompositeTokenGranter.grant方法中生成tokenGranters迭代器,循环匹配当前请求的认证模式

IMG_256

进入AbstractTokenGranter.grant匹对

密码模式(password),会进入ResourceOwnerPasswordTokenGranter

DefaultTokenServices: createAccessToken方法

  1. tokenStore去查找是否之前的access_token过期
  2. 没有找到之前存储的access_token,所以查找:refreshToken没有的话就生成:refreshToken
  3. 根据RefreshToken和OAuth2Authentication创建一个新的OAuth2AccessToken和refreshToken存储起来

创建信息OAuth2AccessToken的时候会调用增强来个性化自己的OAuth2AccessToken

完整流程图

IMG_256

总结

  • Spring security 在web应用中是基于Filter的
  • Spring security Oauth2 基于 Security 框架添加认证模式的逻辑
posted @   wangzhilei  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示