如何访问 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);
    }