Мне нужно отредактировать основной идентификатор, который будет возвращен клиентскому приложению 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




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);