1 回答
TA贡献1831条经验 获得超4个赞
我会创建一个自定义Authentication对象并在其中存储所需的信息。
对于用户相关的数据,存储在其内部Principal。对于非用户相关的数据,听起来Details是一个存储的好地方。
许多内置函数AuthenticationProvider会创建一个UserDetails并存储到Principal. UserDetails这意味着如果您正在使用那些内置的,您可以考虑只创建一个 customsied AuthenticationProvider。
因此,根据您实现身份验证逻辑的方式,您需要自定义相关AuthenticationProvider等Filter。目的是访问HttpServletRequest,从 HTTP 标头获取 JWT,解析 JWT,设置和配置此自定义Authentication对象并将其设置为SecurityContext:
SecurityContextHolder.getContext().setAuthentication(authenication);
Authentication要在 Controller 中访问此对象,您可以使用:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
CurrentUser user = (CurrentUser) auth.getPrincipal();
CurrentRequestDetail detail= (CurrentRequestDetail) auth.getDetails();
/** CurrentUser and CurrentRequestDetail is the customised Principal and Details**/
如果您只需要访问 [ Principal],您可以使用@AuthenticationPrincipal:
@PostMapping("")
public Mono<User> login(@RequestBody User post,
@RequestParam String user_id,
@RequestParam String username,
@AuthenticationPrincipal CurrentUser currentUser) {
//Need to access information from JWT claims here
return this.repository.findById(user_id);
}
添加回答
举报
