Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇 (3)

JwtAuthenticationToken
其authenticated=true,进行实际系统访问的身份。由BearerTokenAuthenticationToken认证后,通过JwtAuthenticationConverter转换而来。

5. 相关 Provider

JwtAuthenticationProvider
对 BearerTokenAuthenticationToken(带access_token)进行认证。

内部会调用JwtDecoder::decode(可通过.bearerTokenResolver().jwt().decode配置)对 "token" 进行解析&验证为Jwt对象。

调用JwtAuthenticationConverter(可通过.bearerTokenResolver().jwt().jwtAuthenticationConverter配置)尝试对Jwt进一步转换为进行实际系统访问的(authenticated=true)JwtAuthenticationToken返回。(默认converter内部会调用jwtGrantedAuthoritiesConverter解析Jwt填充 authorities(将"scpoe"http://www.likecs.com/"scp"声明中空格分隔的字串转为SimpleGrantedAuthority);将"sub"字段作为 principal)

五、前后端分离实战定制

实际情况中,除了OAuth2登录,我们系统自身也有完整的用户体系,也有按自己业务定制的token构建分发服务。
三方登录仅作为绑定手段,而且在初次三方登录时 往往还需补全信息注册到我们自己的用户体系。

最终实现代码以及效果展示都放在Github上了:spring-security-oauth2-sample

登录流程,大致API流程:

Spring Security OAuth2 完全解析 (流程/原理/实战定制) —— Client / ResourceServer 篇

六、后记

从上文也能看出,不得不提 笔者实际用SpringSecurity很多时候宁愿迁出去自己写套Configuer/Filter/Provider…,官方虽提供了很多服务,而且也能看出在尽可能定制化。但背后还是强制耦合引入了太多逻辑,很难与实际业务契合,即便稍有不同在它基础上定制也都需要付出很大代价。这代价不仅指新增代码行数,为了运行稳定 你首先就得彻底清楚它原本引入了哪些逻辑,这就需要大量上手成本。

本文仍存在些许问题,特别是OAuth2AuthorizationCodeGrantFilter的重定向问题,还有与无状态相悖的oauth2AuthorizedClientRepository涉及较少,也没一张清晰流程图,时间关系暂且就这样了。即便要用好也得知其然 知其所以然,笔者撰文也只是尽量往上靠,有什么问题还希望指正讨论。

关于 Spring Security 对 OAuth2 认证服务org.springframework.security:spring-security-oauth2-authorization-server的实现,以及前言提到的 SpringSecurity原理、JWT等等,后面有时间的话也会慢慢更。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzywyj.html