Как мне расширить com.microsoft.azure.spring.autoconfigure.aad.UserPrincipal?

Я использую MSAL во внешнем интерфейсе (PKCE) и azure-active-directory-spring-boot-starter на сервере, чтобы предоставить объект, который представляет вошедшего в систему пользователя и его утверждения.

Я создал класс, который обертывает Microsoft, чтобы обеспечить легкий доступ к хорошо известным утверждениям:

      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 extend UserPrincipal и имеют getPrincipal() вернуть мой собственный тип (без эффективной повторной реализации моего собственного UserPrincipal) вместо предоставления фасада перед объектом-членом. Проблема в том, что UserPrincipal конструкторожидает проблем с JWT , что говорит о том, что это неправильный подход. Есть ли другой, более подходящий способ моделирования пользователя для проекта безопасности Spring, который полагается только на утверждения на стороне клиента?

1 ответ

@ Джош.

В azure-active-directory-spring-boot-starter, используется в AADAuthenticationFilter и AADAppRoleStatelessAuthenticationFilter. Теперь оба фильтра устарели.

Не могли бы вы использовать последнюю версию azure-spring-boot-starter-active-diectory? Это 3.7.0, и он работает для весенней загрузки: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 -активный-каталог # доступ-к-ресурс-серверу

У нас есть образцы. Ваше текущее приложение похоже на:

  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- весна-загрузка-образец-активный-каталог-ресурс-сервер

Другие вопросы по тегам