登录逻辑


验证码 行为验证码AJ-Captcha
网关部分
1. 验证码生成逻辑(网关)
- 模块
aiops-gateway - 接口
GET aiops-gateway/code - 处理类
ImageCodeCreateHandler
2. 登录参数(认证中心)
接口/auth/oauth/token
请求体
- username 用户名
- password 密码(密文) AES加密;
U2FsdGVkX19zqXDDWDmHtyPjTfv3nT3wNNYINJ8z54I= - code 验证码
- randomStr 随机参数
- grant_type:password
- scope: server
请求头
- TENANT-ID: 默认为1
- Authorization: Basic信息 后台的base64(client_id:client_secret)
YWlvcHM6YWlvcHM=
3. 验证码校验逻辑(网关)
- 拦截器
ValidateCodeGatewayFilter - 如何处理验证码不校验的客户端 数据库表
sys_oauth_client_details字段additional_information给值{"captcha_flag":"0"} - 前端密码解密逻辑
PasswordDecoderFilter密钥gateway.encodeKey - 登录为何post body为空,只能url params形式;
- *因为 webflux 获取post body很麻烦,且会出现丢包的现象**;
如何不想放url,就传明文
认证中心
1. 生成token

- 入口:
TokenEndpoint/oauth/token(spring-security.jar包下) - 校验clientId:
ClientDetailsService实现类AiopsClientDetailsServiceImpl.loadClientByClientId查库sys_oauth_client_details与传入校验对比 - 授权:
ResourceOwnerPasswordTokenGranter.getOAuth2Authentication; ProviderManagerDaoAuthenticationProvider- 校验用户:
UserDetailsService实现类AiopsUserDetailsServiceImpl.loadUserByUsername方法 - 调用 用户中心
remoteUserService查数据库sys_user用户信息 - 生成token
AbstractTokenGranter.grant DefaultTokenServices.createAccessTokenAiopsRedisTokenStore.getAccessToken
注意点 租户处理 如 两个不同租户下,有相同的用户 但密码不一样
即:服务之间如何传递租户信息
TenantContextHolderFilter放入ttl中
资源服务器
1. 校验token
- 入口拦截器
OAuth2AuthenticationProcessingFilter OAuth2AuthenticationManager.authenticateRemoteTokenServices.loadAuthentication通过token换用户信息;调用认证中心的/check_token接口- check_token地址:
CheckTokenEndpointDefaultTokenServices.readAccessTokenAiopsRedisTokenStore.readAccessToken
1 | security: |
扫描二维码,分享此文章