Apereo Cas - выпуск пользовательского основного идентификатора

Мне нужно отредактировать основной идентификатор, который будет возвращен клиентскому приложению cas.

Принципал, который мне нужно отредактировать, возвращается из внешнего idp, которым я не владею, и его формат выглядит следующим образом:

Id: idp autogenerated ID having no meaning for my setup
Attributes:
... Some attributes I do not need ...
**ImportantId**(this is the property I need)

Я прочитал официальная документация, поэтому, насколько я понимаю, соответствующая часть моего служебного json-файла должна быть:

...       
"usernameAttributeProvider" : {
        "@class" : "com.mypackage.cas.principal.MyCustomRegisteredServiceUsernameProvider",
        "canonicalizationMode" : "NONE"

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

public class MyCustomRegisteredServiceUsernameProvider implements RegisteredServiceUsernameAttributeProvider {

    @Autowired
    UsersService usersService;

    @Override
    public String resolveUsername(Principal principal, Service service, RegisteredService registeredService) {
        // String importantId = ...getting it from principal attributes.. 
        return usersService.getUserNameFromImportant(importantId);

    }   
}

Проблема в том, что аннотация Autowired, к сожалению, не работает, поэтому мой UsersService не инициализирован, что приводит к NPE во время выполнения.

Итак, во-первых, я хотел бы знать, почему мой подход не работает, а во-вторых, каков «официальный» способ добиться такого поведения?

Cas Версия: 5.3.4 Шаблон наложения Cas

Env: W10 x64, Java 8

Развернут на Wildfly 12

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
194
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

So, firstly I would like to know why my approach is not working

... потому что такие поставщики не являются компонентами с пружинным управлением. Это сериализованные объекты, обнаруженные в документах JSON и т.п., которые никогда не проходят через среду выполнения Spring.

and secondly what is the cas "official" way to achieve this behavior?

Одним из возможных обходных путей было бы удалить введенное поле и сделать это в вашем методе resolveUsername:

var appContext = ApplicationContextProvider.getApplicationContext();
var usersService = appContext.getBean("bean-name", UsersService.class);
return usersService.getUserNameFromImportant(importantId);

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