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);
}
添加回答
举报