0

我在前端 (PKCE) 和azure-active-directory-spring-boot-starter服务器上使用 MSAL 来提供一个代表登录用户及其声明的实体。

我构建了一个包含 Microsoft 的类,UserPrincipal以提供对众所周知的声明的轻松访问:

import com.microsoft.azure.spring.autoconfigure.aad.UserPrincipal;
public class MyCustomUser {
    private UserPrincipal userPrincipal;

    public MyCustomUser(UserPrincipal userPrincipal) {
        this.userPrincipal = userPrincipal;
    }

    public String getEmployeeId() {
        return String.valueOf(this.userPrincipal.getClaim("emplid"));
    }
}

我通过帮助类提供它

@Component
public class MyAppSecurityContext {
    public MyCustomUser getUser() {
        UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        return new MyCustomUser(principal);
    }
}

然后在我的服务层中使用它:

@Service
public class AnnouncementServiceImpl implements AnnouncementService {

    @Autowired
    private MyAppSecurityContext securityContext;

    @Override
    public List<Announcement> saveAnnouncement(Announcement announcement) {
        MyCustomUser currentUser = this.securityContext.getUser();
        String empid = currentUser.getEmployeeId();

        return this.announcementRepository.saveAnnouncement(empid, announcement);
    }
}

这行得通,但感觉不对。我宁愿拥有 MyCustomUser extendUserPrincipal 并getPrincipal()返回我的自定义类型(没有有效地重新实现我自己的UserPrincipal),而不是在成员对象前面提供外观。问题是 UserPrincipal 的构造函数需要 JWT 关注点,这表明这不是正确的方法。是否有另一种更合适的方法来为仅依赖于客户端声明的 Spring 安全项目的用户建模?

4

1 回答 1

0

@乔希。

azure-active-directory-spring-boot-starter,UserPrincipal用于AADAuthenticationFilterAADAppRoleStatelessAuthenticationFilter。现在这两个过滤器都被弃用了。

请问可以用最新版azure-spring-boot-starter-active-diectory吗?这是 3.7.0,它适用于 spring-boot:2.5.0。既然你使用UserPrincipal了,那么你的应用程序就是一个资源服务器。

这是文档:https ://github.com/Azure/azure-sdk-for-java/tree/azure-spring-boot-starter-active-directory_3.7.0/sdk/spring/azure-spring-boot-starter -active-directory#accessing-a-resource-server

我们有一些样品。您当前的应用程序类似于:

  1. https://github.com/Azure-Samples/azure-spring-boot-samples/tree/azure-spring-boot_3.6/aad/azure-spring-boot-sample-active-directory-resource-server-by-无状态过滤器
  2. https://github.com/Azure-Samples/azure-spring-boot-samples/tree/azure-spring-boot_3.6/aad/azure-spring-boot-sample-active-directory-resource-server-by-筛选

但不推荐使用 2 的用法,建议您学习新方法:https ://github.com/Azure-Samples/azure-spring-boot-samples/tree/azure-spring-boot_3.6/aad/azure- spring-boot-sample-active-directory-resource-server

于 2021-07-30T07:08:01.463 回答