2017-08-18 72 views
1

我已經部署截至目前兩個彈簧引導微服務:在微服務中共享用戶ID的最佳做法是什麼?

  1. 驗證網關
  2. 業務邏輯RESTful服務。

成功登錄後,Auth Gateway發出一個jwt令牌。對於下一個請求,它會在將請求重定向到業務邏輯之前驗證/授權jwt令牌。
從Auth網關分享用戶相關信息到其他服務的最佳方式是什麼?使用SpringSecurity和Spring Boot編寫Auth Gateway

+2

編碼在JWT所有必要的信息(用戶ID等),令牌 – StanislavL

+0

@StanislavL你的意思是,更新後登錄的用戶ID等的JWT令牌? –

回答

1

在JWT令牌中編碼所有必要的詳細信息(用戶ID等)。

您發出的驗證網關和智威湯遜訪問令牌,令牌具有三個部分:頭,索賠和簽名

將所有必要的信息到索賠部分。見the example

@Component 
public class JwtTokenFactory { 
    private final JwtSettings settings; 

    @Autowired 
    public JwtTokenFactory(JwtSettings settings) { 
     this.settings = settings; 
    } 

    /** 
    * Factory method for issuing new JWT Tokens. 
    * 
    * @param username 
    * @param roles 
    * @return 
    */ 
    public AccessJwtToken createAccessJwtToken(UserContext userContext) { 
     if (StringUtils.isBlank(userContext.getUsername())) 
      throw new IllegalArgumentException("Cannot create JWT Token without username"); 

     if (userContext.getAuthorities() == null || userContext.getAuthorities().isEmpty()) 
      throw new IllegalArgumentException("User doesn't have any privileges"); 

     Claims claims = Jwts.claims().setSubject(userContext.getUsername()); 
     claims.put("scopes", userContext.getAuthorities().stream().map(s -> s.toString()).collect(Collectors.toList())); 

     DateTime currentTime = new DateTime(); 

     String token = Jwts.builder() 
      .setClaims(claims) 
      .setIssuer(settings.getTokenIssuer()) 
      .setIssuedAt(currentTime.toDate()) 
      .setExpiration(currentTime.plusMinutes(settings.getTokenExpirationTime()).toDate()) 
      .signWith(SignatureAlgorithm.HS512, settings.getTokenSigningKey()) 
     .compact(); 

     return new AccessJwtToken(token, claims); 
    } 
相關問題