Spring Security-24-Spring Security OAuth核心源码

上文中,实现了认证服务器和资源服务器,四种 OAuth 的授权也可以使用了,但是现在仅限于 Spring Security OAuth 给出的4种授权模式,我们之前写的 用户名密码认证, 短信认证, 第三方社交账号认证,这都是不支持的, 那如何让我们自己写的认证方式也按照 OAuth 这样返回一个token, 下面首先来了解一下 Spring Security OAuth 的一些核心的代码

流程

image

如图(绿色部分是model, 蓝色部分是接口,以及他们各自的默认实现类)

  • TokenEndPoint: 流程入口点, 用来处理获取令牌的请求
  • ClientDeatilsService: 读取第三方应用信息,根据传过来的clientId,读取client相应的一些配置信息
  • ClientDetails: 封装第三方应用的信息
  • TokenRequest: 封装了请求中的其他参数, 比如 grant_type, scope 等等, TokenRequest 包含了 ClientDetails
  • TokenGranter: 封装了4种授权模式的实现,根据 grant_type 去找一个具体的实现, 执行完毕后会生成 OAuthRequestAuthentication
  • OAuthRequest: 包含了 ClientDetailsTokenRequest
  • Authentication: 封装的授权用户的信息,是通过 UserdetailsService 查询出来的,最终 OAuthRequestAuthentication 会组成一个 OAuth2Authentication 对象
  • OAuth2Authentication: 通过这个对象可以知道,是哪个用户在哪个应用请求授权,走的是哪种授权模式等等这些信息
  • AuthorizationServerTokenServices: 最终生成令牌的地方,这个对象引用了 TokenStore 负责令牌的存取,还有 TokenEnhancer 令牌的增强器,对生成之后的令牌做一些处理

源码

根据上面的流程一步一步去看一下代码, 首先是 TokenEndPoint 如下:
image

然后这个类最后会调用 TokenGranter, 看下这个的代码:
image

这里也就是做了个验证,然后调用 AuthorizationServerTokenServices 代码如下:
image

这里才是真正创建token的地方, 然后创建token的方法是
image

整个大致的流程就是这样, 一些具体的代码可以自己点进去看一下