ZLT中的设计

image.png

授权服务器:负责登录认证、token派发、token刷新、应用接入管理等功能

API网关:添加认证中心的sdk负责所有请求的鉴权,包括登录验证和url级别的权限判断,主要的JWT原理如下:

  1. 拦截请求获取判断是否带有token参数(parameter和header)
  2. 通过公钥pubkey.txt解密token
  3. 判断token中的权限信息是否能访问当前url
  4. 把用户名和角色信息放到请求的header中,传给后面的微服务

TokenResolver(TokenArgumentResolver类):嵌入在微服务程序中负责获取当前登录人,主要原理如下:

  1. 判断当前url请求的方法有没有带有@LoginUser注解
  2. 判断@LoginUser注解的isFull属性是否为true则通过username查询用户对象
  3. 构建SysUser对象传给目标方法

Spring Security oAuth2 讲解

推荐下面的文档
https://www.funtl.com/zh/spring-security-oauth2/

即要实现下面的几个主要模块:
- AuthorizationConfig 配置
- AbstractTokenGranter 授权
- ClientDetailsService 租户服务
- userDetailsService 用户服务
- TokenStore Token的储存生成服务

  1. @AutoConfigureAfter(AuthorizationServerEndpointsConfigurer.class)
  2. public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
  3. /**
  4. * 注入authenticationManager 来支持 password grant type
  5. */
  6. @Autowired
  7. private AuthenticationManager authenticationManager;
  8. @Resource
  9. private UserDetailsService userDetailsService;
  10. @Autowired
  11. private TokenStore tokenStore;
  12. @Autowired
  13. private WebResponseExceptionTranslator webResponseExceptionTranslator;
  14. @Autowired
  15. private RedisClientDetailsService clientDetailsService;
  16. @Autowired
  17. private RandomValueAuthorizationCodeServices authorizationCodeServices;
  18. @Autowired
  19. private TokenGranter tokenGranter;

代码分析

  1. ZLT使用oauth-token拦截器, 1) 赋值租户 2) 统一返回token格式
  1. public class OauthTokenAspect {
  2. @Around("execution(* org.springframework.security.oauth2.provider.endpoint.TokenEndpoint.postAccessToken(..))")
  3. public Object handleControllerMethod(ProceedingJoinPoint joinPoint) throws Throwable {
  4. try {

授权代理授权

  1. @Bean
  2. public TokenGranter tokenGranter() {
  3. if (tokenGranter == null) {
  4. tokenGranter = new TokenGranter() {
  5. private CompositeTokenGranter delegate;
  6. @Override
  7. public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) {
  8. if (delegate == null) {
  9. delegate = new CompositeTokenGranter(getAllTokenGranters());
  10. }
  11. return delegate.grant(grantType, tokenRequest);
  12. }
  13. };
  14. }
  15. return tokenGranter;
  16. }