认证后请求其他服务时,如何从JWT令牌中获取用户名?

时间:2019-02-07 10:22:46

标签: spring-boot authentication jwt netflix-eureka netflix-zuul

我正在开发一个带有boot6前端的spring boot应用程序,并将Eureka用于服务注册表,将zuul用于身份验证网关,这两个都是单独的服务。我正在使用jwt进行身份验证。

当我使用授权头(其值为jwt令牌)访问URL localhost:8080 / dis / academics / complaint / getMyComplaints时,它将转到网关服务,然后在网关进行有效身份验证后,网关将其转发给学术服务。

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

网关服务中的控制器

@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();
}
}

我尝试使用Authentication类,但得到空值。我该如何实现?

1 个答案:

答案 0 :(得分:1)

Zuul默认情况下不会转发您的 Authorization 标头。您将必须在zuul中进行显式配置以使其执行此操作。 您的服务必须在其他服务器上。 您必须在zuul属性中更改敏感头标头设置(可能是application.yml)。默认情况下,它接受以下输入。

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

如果您确定要在所有服务中转发标头,则只需将其更改为

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

我希望这会有所帮助。