Как хранить пользовательскую информацию в SecurityContext из Spring-Security? - PullRequest
6 голосов
/ 20 июля 2010

В моем приложении я использую аутентификацию LDAP.Но у меня также есть 2 удаленных службы, которые требуют аутентификации через метод входа в систему (имя пользователя, пароль).Метод возвращает токен безопасности, который позволяет мне вызывать другие методы, т.е. я должен передать токен безопасности методу службы в качестве первого аргумента.
Поэтому я хотел бы получить эти токены безопасности сразу после успешного входа в систему с использованием LDAP и сохранить их вSecurityContext.Я попытался использовать элемент authentication-success-handler-ref из form-login .Используя обработчик, я заменяю Authentication объект в SecurityContext на пользовательский AuthenticationToken, который содержит не только пароль, но и токены безопасности.Но в этом случае у меня есть исключение, что ни один поставщик аутентификации не поддерживает этот класс токенов.Я знаю, что также можно хранить токены в сеансе HTTP, но в этом случае мне нужно передать сеанс в сервисный объект, поэтому я хотел бы сохранить токены в SecurityContext.

Каков наилучший подход для обработкислужебный токен безопасности?

Ответы [ 2 ]

11 голосов
/ 20 июля 2010

Я часто использую объект 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();
4 голосов
/ 20 июля 2010

Ваша реализация UserDetails может содержать любые дополнительные данные. Это то, что хранится в SecurityContext, который позже становится доступным после успешного входа в систему.

Позже вы можете получить к нему доступ (Предполагается, что MyUserDetails реализует UserDetails)

Object principal = SecurityContextHolder.getContext().getAuthentication();
if (principal instanceof MyUserDetails) {
  MyUserDetails mud = (MyUserDetails) principal;
  mud.getMyData(); //Extract your additional data here
}
...