身份验证后请求其他服务时如何从 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
希望对您有所帮助。
我正在开发一个 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
希望对您有所帮助。