前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring-authorization-server令牌放发源码解析

spring-authorization-server令牌放发源码解析

原创
作者头像
用户1219866
发布2022-06-12 21:38:56
9330
发布2022-06-12 21:38:56
举报
文章被收录于专栏:lengleng
Token 生成全流程
Token 生成全流程
代码语言:text
复制
POST /auth/oauth2/token?grant_type=password&scope=server HTTP/1.1
Host: pig-gateway:9999
Authorization: Basic dGVzdDp0ZXN0
Content-Type: application/x-www-form-urlencoded
Content-Length: 32
username=admin&password=YehdBPev

⓪ 网关前置处理

验证码校验 ValidateCodeGatewayFilter.java 参考资料: 验证码配置开关 前端已加密的密码进行解密 PasswordDecoderFilter.java , 主要就是把如下图的 password 密文转成明文交由 SpringSecurity 处理

参考资料: 前端登录请求加密流程参考

① 客户端认证处理

  • 如上图在登录请求中会携带 Basic base64(clientId:clientSecret), 那么首先OAuth2ClientAuthenticationFilter 会通过调用 RegisteredClientRepository (数据库存储) 来判断传入的客户端是否正确

③ 正式接收登录请求

OAuth2TokenEndpointFilter 会接收通过上文 OAuth2ClientAuthenticationFilter 客户端认证的请求

④ 组装认证对象

AuthenticationConverter 会根据请求中的参数和授权类型组装成对应的授权认证对象

⑤ 登录认证对象

代码语言:text
复制
public class XXXAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken {

}

⑥ 授权认证调用

⑦ 核心认证逻辑

多用户体系匹配 UserDetailsService

密码匹配校验

用户状态校验

⑧ 用户查询逻辑

用户查询逻辑的多种实现形式 解耦: 通过 feign 查询其他系统获取并组装成 UserDetails 简单: 认证中心直接查询 DB 并组装成 UserDetails

⑨ 密码校验逻辑

默认支持加密方式如下:undefined{noop}密码明文undefined{加密特征码}密码密文undefinedPasswordEncoder 会自动根据特征码匹配对应的加密算法,所以上一步 ⑧ 查询用户对象组装成 UserDetails 需要特殊处理

代码语言:java
复制
return new UserDetails(user.getUsername(),"{bcrypt}"+"数据库存储的密文");

⑩ 生成 OAuth2AccessToken

⑪ Token 存储持久化

当前 SAS 仅支持 JDBC 和内存 ,PIG 扩展支持 Redis 实现

⑫ 登录成功事件处理

基于 SpringEvent 事件处理,可以在这里做更多的处理 日志、个性化等处理逻辑

⑬ 请求结果输出 Token

代码语言:java
复制
private void sendAccessTokenResponse(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException {

		OAuth2AccessTokenAuthenticationToken accessTokenAuthentication = (OAuth2AccessTokenAuthenticationToken) authentication;

		OAuth2AccessToken accessToken = accessTokenAuthentication.getAccessToken();
		OAuth2RefreshToken refreshToken = accessTokenAuthentication.getRefreshToken();
		Map<String, Object> additionalParameters = accessTokenAuthentication.getAdditionalParameters();
		// 无状态 注意删除 context 上下文的信息
		SecurityContextHolder.clearContext();
		this.accessTokenHttpResponseConverter.write(accessTokenResponse, null, httpResponse);
	}

定义具体的输出返回格式等逻辑

本文配套源码: https://github.com/pig-mesh/pig

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ⓪ 网关前置处理
  • ① 客户端认证处理
  • ③ 正式接收登录请求
  • ④ 组装认证对象
  • ⑤ 登录认证对象
  • ⑥ 授权认证调用
  • ⑦ 核心认证逻辑
    • 多用户体系匹配 UserDetailsService
      • 密码匹配校验
        • 用户状态校验
        • ⑧ 用户查询逻辑
        • ⑨ 密码校验逻辑
        • ⑩ 生成 OAuth2AccessToken
        • ⑪ Token 存储持久化
        • ⑫ 登录成功事件处理
        • ⑬ 请求结果输出 Token
        相关产品与服务
        验证码
        腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档