Как мне расширить 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-Samples/azure-spring-boot-samples/tree/azure-spring-boot_3.6/aad/azure-spring-boot-sample-active-directory-resource-server-by- без фильтра
- 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- весна-загрузка-образец-активный-каталог-ресурс-сервер