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 处理**
参考资料: 前端登录请求加密流程参考
OAuth2TokenEndpointFilter 会接收通过上文 OAuth2ClientAuthenticationFilter 客户端认证的请求
AuthenticationConverter 会根据请求中的参数和授权类型组装成对应的授权认证对象
public class XXXAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken { }
用户查询逻辑的多种实现形式
- 解耦: 通过 feign 查询其他系统获取并组装成 UserDetails
- 简单: 认证中心直接查询 DB 并组装成 UserDetails
默认支持加密方式如下:
{noop}密码明文
{加密特征码}密码密文
PasswordEncoder 会自动根据特征码匹配对应的加密算法,所以上一步 ⑧ 查询用户对象组装成 UserDetails 需要特殊处理
return new UserDetails(user.getUsername(),"{bcrypt}"+"数据库存储的密文");
当前 SAS 仅支持 JDBC 和内存 ,PIG 扩展支持 Redis 实现
基于 SpringEvent 事件处理,可以在这里做更多的处理 日志、个性化等处理逻辑
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多平台发布