Как получить имя пользователя из токена JWT при запросе другой службы после аутентификации? - PullRequest
0 голосов
/ 07 февраля 2019

Я разрабатываю приложение с загрузочной пружиной, имеющее интерфейс с angular6 и использующее Eureka для реестра служб и zuul для шлюза аутентификации, оба в качестве отдельной службы.Я использую jwt для аутентификации.

Когда я нажимаю на url localhost: 8080 / dis / academics / complaint / getMyComplaints с заголовком авторизации, имеющим значение токена 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();
}
}

Я пытался использовать класс аутентификации, но получил нулевое значение.Как мне этого добиться?

1 Ответ

0 голосов
/ 07 февраля 2019

Zuul по умолчанию не передает ваш заголовок Authorization .Вам придется явно настроить в zuul, чтобы он это сделал.Ваши услуги должны быть на другом сервере.Вы должны изменить настройки заголовка sensitve в свойствах 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

Надеюсь, это поможет.

...