乐趣区

关于后端:springauthorizationserver令牌放发源码解析

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

明码匹配校验

用户状态校验

⑧ 用户查问逻辑

用户查问逻辑的多种实现模式

  • 解耦:通过 feign 查问其余零碎获取并组装成 UserDetails
  • 简略: 认证核心间接查问 DB 并组装成 UserDetails

⑨ 明码校验逻辑

默认反对加密形式如下:
{noop}明码明文
{加密特色码} 明码密文
PasswordEncoder 会主动依据特色码匹配对应的加密算法,所以上一步 ⑧ 查问用户对象组装成 UserDetails 须要非凡解决

return new UserDetails(user.getUsername(),"{bcrypt}"+"数据库存储的密文");

⑩ 生成 OAuth2AccessToken

⑪ Token 存储长久化

以后 SAS 仅反对 JDBC 和内存,PIG 扩大反对 Redis 实现

⑫ 登录胜利事件处理

基于 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

退出移动版