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 会根据请求中的参数和授权类型组装成对应的授权认证对象
⑤ 登录认证对象
public class XXXAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken {
}
⑥ 授权认证调用
⑦ 核心认证逻辑
多用户体系匹配 UserDetailsService
密码匹配校验
用户状态校验
⑧ 用户查询逻辑
⑨ 密码校验逻辑
默认支持加密方式如下:
{noop}密码明文
{加密特征码}密码密文
PasswordEncoder 会自动根据特征码匹配对应的加密算法,所以上一步 ⑧ 查询用户对象组装成 UserDetails 需要特殊处理
return new UserDetails(user.getUsername(),"{bcrypt}"+"数据库存储的密文");
⑩ 生成 OAuth2Accesstoken
⑪ Token 存储持久化
⑫ 登录成功事件处理
基于 SpringEvent 事件处理,可以在这里做更多的处理 日志、个性化等处理逻辑
⑬ 请求结果输出 Token
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
本文由mdnice多平台发布
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。