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

Используя указатели будет более эффективным, так как контейнеры будут только копировать указатели вокруг вместо полных объектов.

существует немного полезной информации здесь о контейнерах STL и интеллектуальных указателях:

, Почему он неправильно для использования станд.:: auto_ptr< > со стандартными контейнерами?

20
задан Cœur 9 April 2018 в 13:54
поделиться

2 ответа

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

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

Вот ссылка на документацию для этого: руководство по безопасности пружин, глава 8 Here is a blog post talking about implementing a custom user details service for password encryption: example usage

Hope this helps

Edit: Forgot to mention that the object will be removed from the security context and session on logout. That is what is most useful about it, it is fully managed by spring security.

18
ответ дан 30 November 2019 в 01:16
поделиться

Вам определенно нужно написать свой собственный UserDetailService . В объекте Principal есть пользователь, а также объект Details в AuthenticationToken , в котором вы можете хранить карту (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 Security Filter.

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

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

0
ответ дан 30 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

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