我正在开发一个带有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类,但得到空值。我该如何实现?
答案 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
我希望这会有所帮助。