В моем приложении я использую аутентификацию LDAP. Но я, также имеют 2 удаленных сервиса, который требует аутентификации через вход в систему метода (имя пользователя, пароль). Метод возвращает маркер безопасности, который делает меня способным вызвать другого методы, т.е. Я должен передать маркер безопасности для обслуживания методов как первого аргумента.
Таким образом, я хотел бы получить эти маркеры безопасности сразу после успешного входа в систему с помощью LDAP и сохранить их в SecurityContext. Я пытался использовать authentication-success-handler-ref элемента входа в систему формы. Используя обработчик я заменяю объект Аутентификации в SecurityContext с пользовательским AuthenticationToken, который содержит не только пароль, но также и маркеры безопасности. Но и в этом случае у меня есть исключение, что никакой поставщик аутентификации не поддерживает этот класс маркера. Я знаю, что также возможно сохранить маркеры на Сеансе HTTP, но в этом случае я должен передать сессию объекту службы, таким образом, я хотел бы сохранить маркеры в SecurityContext.
Что лучший подход должен обработать сервисный маркер безопасности?
Я часто использую объект Authentication.getDetails ()
для хранения дополнительной информации, которая не может быть напрямую связана с пользователем. Таким образом, вы можете сохранить любой объект в этом поле (например, HashMap), и он разделяет жизненный цикл объекта Authentication
.
HashMap<String, Object> info = new HashMap<String, Object>();
info.put("extraInfo", "info");
auth.setDetails(info);
...
Map<String, Object> i = (Map<String, Object>)SecurityContextHolder.getContext().getAuthentication.getDetails();
Ваша реализация 'UserDetails' может содержать любые дополнительные данные. Это то, что хранится в SecurityContext, к которому позже можно получить доступ после успешного входа в систему.
Вы можете позже получить к нему доступ как (Предполагается, что MyUserDetails реализует UserDetails)
Object principal = SecurityContextHolder.getContext().getAuthentication();
if (principal instanceof MyUserDetails) {
MyUserDetails mud = (MyUserDetails) principal;
mud.getMyData(); //Extract your additional data here
}