如何访问 Spring 引导控制器中的 java.security.Principal 属性?
How to access java.security.Principal attributes inside Spring Boot controller?
我有一个 Angular 前端提示用户使用 Microsoft Azure Active Directory 登录。当用户访问我的 API.
时,将正确的 headers 添加到请求中
我的 API 是根据本 (Protect a resource server/API) 指南保护的 Spring 后备箱 API。
我的控制器有以下使用 java.security.Principal 接口作为参数的方法。
@GetMapping("/test")
ResponseEntity<Object> test(Principal principal) {
return ResponseEntity.ok(principal);
}
当我设置断点时,我看到了我想要获得的属性,例如 principal.attributes.unique_name,但我不能通过 Principal 接口访问这些属性。关于如何实现这一目标的任何想法?
PS:我看过类似的问题(How to get all attributes from java.security.Principal?),但他们的回答无法帮助我...
如此 Baeldung guide 中所述,您可以通过 SecurityContextHolder 访问主体。
将此对象转换为 AADOAuth2AuthenticatedPrincipal 可提供对原则属性的访问,如下所示。
AADOAuth2AuthenticatedPrincipal principal = (AADOAuth2AuthenticatedPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Map<String, Object> attributes = principal.getAttributes();
String name = String.valueOf(attributes.get("unique_name"));
另一种选择是通过使用下面评论中指出的 @AuthenticationPrincipal
注释直接在控制器参数中使用 AADOAuth2AuthenticatedPrincipal
。
@GetMapping("/test")
ResponseEntity<String> test(@AuthenticationPrincipal AADOAuth2AuthenticatedPrincipal principal) {
Map<String, Object> attributes = principal.getAttributes();
String name = String.valueOf(attributes.get("unique_name"));
return ResponseEntity.ok(name);
}
我有一个 Angular 前端提示用户使用 Microsoft Azure Active Directory 登录。当用户访问我的 API.
时,将正确的 headers 添加到请求中我的 API 是根据本 (Protect a resource server/API) 指南保护的 Spring 后备箱 API。
我的控制器有以下使用 java.security.Principal 接口作为参数的方法。
@GetMapping("/test")
ResponseEntity<Object> test(Principal principal) {
return ResponseEntity.ok(principal);
}
当我设置断点时,我看到了我想要获得的属性,例如 principal.attributes.unique_name,但我不能通过 Principal 接口访问这些属性。关于如何实现这一目标的任何想法?
PS:我看过类似的问题(How to get all attributes from java.security.Principal?),但他们的回答无法帮助我...
如此 Baeldung guide 中所述,您可以通过 SecurityContextHolder 访问主体。
将此对象转换为 AADOAuth2AuthenticatedPrincipal 可提供对原则属性的访问,如下所示。
AADOAuth2AuthenticatedPrincipal principal = (AADOAuth2AuthenticatedPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
Map<String, Object> attributes = principal.getAttributes();
String name = String.valueOf(attributes.get("unique_name"));
另一种选择是通过使用下面评论中指出的 @AuthenticationPrincipal
注释直接在控制器参数中使用 AADOAuth2AuthenticatedPrincipal
。
@GetMapping("/test")
ResponseEntity<String> test(@AuthenticationPrincipal AADOAuth2AuthenticatedPrincipal principal) {
Map<String, Object> attributes = principal.getAttributes();
String name = String.valueOf(attributes.get("unique_name"));
return ResponseEntity.ok(name);
}