Подтвердить что ты не робот

Как управлять пользовательским пользовательским объектом в сеансе, когда Spring Безопасность проверяет пользователя?

Когда Spring Безопасность аутентифицирует пользователя, он создает объект UserDetail и доступен для поиска текущего UserId в веб-приложении. Но позвольте сказать, что я хочу сохранить пользовательский объект с настройками и другими сведениями вместе с UserDetails или заменой UserDetails.

Итак, как добавить пользовательский объект к сеансу, когда Spring Аутентификация безопасности успешно? И как удалить пользовательский пользовательский объект из сеанса, когда Spring Security выводит вход в систему.

Или есть ли подходящий способ сделать это?

4b9b3361

Ответ 1

Лучший способ сделать это IMO заключается в том, чтобы одна из ваших служб (возможно, UserService) реализовала UserDetailsService и указала в XML-безопасности spring, что вы хотите использовать свою собственную службу пользовательских данных.

Что нужно UserDetailsService, так это реализовать метод loadByUsername (String username). Этот метод должен будет вернуть класс, который реализует UserDetails. Это может быть ваш собственный пользовательский объект, хранящий все, что вам нравится. Преимущество этого заключается в том, что вы можете получить доступ к свойствам объекта из JSP с помощью тега spring securityliblib, и он также всегда доступен из одноэлементного обеспечения безопасности (безопасности) SecurityContextHolder в spring.

Вот ссылка на документы для этого: spring руководство по безопасности, глава 8 Вот сообщение в блоге, в котором говорится о внедрении пользовательской пользовательской информации для шифрования паролей: пример использования

Надеюсь, что это поможет

Изменить: забыл упомянуть, что объект будет удален из контекста безопасности и сеанса при выходе из системы. Это то, что наиболее полезно в этом, оно полностью управляется безопасностью spring.

Ответ 2

Вам определенно нужно написать свой собственный UserDetailService. В объекте Principal есть пользователь, и в AuthenticationToken есть объект Details, в котором вы можете сохранить карту (String, String) другой информации для входа.

public class RequestFormDeatils extends SpringSecurityFilter {

   protected void doFilterHttp(HttpServletRequest request, ...) {
      SecurityContext sec = SecurityContextHolder.getContent();
      AbstractAuthenticationToken auth = (AbstractAuthenticationToken)sec.getAuthentication();
      Map<String, String> m = new HashMap<String, String>;
      m.put("myCustom1", request.getParameter("myCustom1"));
      m.put("myCustom2", request.getParameter("myCustom2"));
      auth.setDetails(m);
}

Теперь в любом месте вашего кода вы используете SecurityContext для распространения этой информации, связанной с безопасностью, без необходимости связывать ее с вашим объектом UserDetails или передавать ее в качестве аргументов. Я делаю этот код в SecurityFilter в конце цепочки фильтров Spring.

<bean id="requestFormFilter" class="...RequestFormDetails">
   <custom-filter position="LAST" />
</bean> 

Эта информация будет удалена при удалении пользователя (например, при выходе из системы).