springSecurityOAuth核心源码解析
绿色的代表类,蓝色的代表接口,括号中为真正实现类
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迭代器,循环匹配当前请求的认证模式
进入AbstractTokenGranter.grant匹对
密码模式(password),会进入ResourceOwnerPasswordTokenGranter
DefaultTokenServices: createAccessToken方法
- tokenStore去查找是否之前的access_token过期
- 没有找到之前存储的access_token,所以查找:refreshToken没有的话就生成:refreshToken
- 根据RefreshToken和OAuth2Authentication创建一个新的OAuth2AccessToken和refreshToken存储起来
创建信息OAuth2AccessToken的时候会调用增强来个性化自己的OAuth2AccessToken
完整流程图
总结
- Spring security 在web应用中是基于Filter的
- Spring security Oauth2 基于 Security 框架添加认证模式的逻辑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南