Apereo Cas - Пользовательский основной идентификатор релиза - PullRequest
0 голосов
/ 08 ноября 2018

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

Конверт: W10 x64, Java 8

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

1 Ответ

0 голосов
/ 10 ноября 2018

Итак, во-первых, я хотел бы знать, почему мой подход не работает

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

а во-вторых, каков "официальный" способ добиться такого поведения?

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

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