身份验证后请求其他服务时如何从 JWT 令牌获取用户名?

How to get username from JWT token while requesting for another service after authentication?

我正在开发一个 spring 引导应用程序,其前端带有 angular6,使用 Eureka 进行服务注册,使用 zuul 进行身份验证网关,两者都作为单独的服务。我正在使用 jwt 进行身份验证。

当我点击 url localhost:8080/dis/academics/complaint/getMyComplaints 授权 header 具有值 jwt 令牌时,它会转到网关服务,然后网关将其转发给学者在网关进行有效身份验证后的服务。

现在我想从学术服务中的令牌获取用户名。我怎样才能得到它?

网关服务中的控制器

@RestController
@RequestMapping("/dis")
public class AuthRestAPIs {

@PostMapping("/signin")
public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginForm loginRequest) {

    Authentication authentication = authenticationManager.authenticate(
            new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));

    SecurityContextHolder.getContext().setAuthentication(authentication);

    String jwt = jwtProvider.generateJwtToken(authentication);
    //UserDetails userDetails = (UserDetails) authentication.getPrincipal();
    UserPrinciple userPrincipal = (UserPrinciple) authentication.getPrincipal();
    return ResponseEntity.ok(new JwtResponse(jwt, userPrincipal.getUsername(), userPrincipal.getUserType(), userPrincipal.getAuthorities()));
}
} 

学术服务总监

@RestController
@RequestMapping("/complaint") 
public class ComplaintsController {
@RequestMapping(value = "/getMyComplaints", method = RequestMethod.GET)
public <T, U> Object[]  getMyComplaints(Authentication authentication)
{
    String username = authentication.getName();

    //System.out.println(username);

    String user_type = "student";

    List<Object> complaints = new ArrayList<>();

    if(user_type.equals("student"))
    {
        Collections.addAll(complaints, cleanlinessComplaintRepository.findByCreatedBy(username));
        Collections.addAll(complaints, leComplaintRepository.findByCreatedBy(username));
        Collections.addAll(complaints, facultyComplaintRepository.findByCreatedBy(username));
        Collections.addAll(complaints, otherComplaintRepository.findByCreatedBy(username));
    }

    return complaints.toArray();
}
}

我已尝试使用身份验证 class,但得到的是空值。我怎样才能做到这一点?

Zuul 默认不会转发你的 Authorization header 。您将必须在 zuul 中明确配置以使其执行此操作。 您的服务必须在不同的服务器上。 您必须更改 zuul 属性中的敏感 header 设置(可能是 application.yml)。默认情况下,它采用以下输入。

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders: Cookie,Set-Cookie,Authorization
      url: https://downstream

如果您非常确定在所有服务中转发您的header,那么只需将此更改为

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders:
      url: https://downstream

希望对您有所帮助。