[英]Spring boot controller retrieve UserDetails
Hello so i have this method in JwtUtill你好所以我在 JwtUtill 有这个方法
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = extractEmail(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
But how can i request UserDetails in controller?但是我如何在 controller 中请求用户详细信息?
@GetMapping("/validateToken")
public String validateToken(@RequestHeader(value="token") String token) {
if(jwtUtil.validateToken(token,???)) {
}
}
Angular side Angular侧
public isTokenExpired(): Observable<string> {
const headers = new HttpHeaders().set('token', localStorage.getItem('token'));
return this.httpClient.get<string>('http://localhost:8080/api/validateToken', {headers, responseType: 'text' as 'json'});
}
Also as frontend im using angular也作为前端使用 angular
You can simply inject it using @AuthenticationPrincipal
.您可以简单地使用@AuthenticationPrincipal
注入它。 Eg:例如:
@GetMapping("/validateToken")
public String validateToken(@AuthenticationPrincipal UserDetails userDetails, ...
UserDetails comes in the security context in the principal UserDetails 来自主体中的安全上下文
UserDetails userDetails =
(UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
It seems like you are using jwt
, you don't need UserDetails
to compare it with.好像您正在使用jwt
,您不需要UserDetails
来比较它。
change methods as:改变方法为:
public Boolean validateToken(String token) {
final String username = extractEmail(token);
return (!StringUtils.isEmpty(username) && !isTokenExpired(token));
}
@GetMapping("/validateToken")
public String validateToken(@RequestHeader(value="token") String token) {
if(jwtUtil.validateToken(token)) {
}
}
If your token is invalid you will not get exception in
extractEmail
method and if it is expired then methodisTokenExpired
will returnfalse
.如果您的令牌无效,您将不会在extractEmail
方法中获得异常,如果它已过期,则方法isTokenExpired
将返回false
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.