Как хранить пользовательскую информацию в SecurityContext пружинной безопасности?

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

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

6
задан viator 20 July 2010 в 06:54
поделиться

2 ответа

Я часто использую объект 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();
11
ответ дан 8 December 2019 в 15:58
поделиться

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

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

Object principal = SecurityContextHolder.getContext().getAuthentication();
if (principal instanceof MyUserDetails) {
  MyUserDetails mud = (MyUserDetails) principal;
  mud.getMyData(); //Extract your additional data here
}
4
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: