Используя указатели будет более эффективным, так как контейнеры будут только копировать указатели вокруг вместо полных объектов.
существует немного полезной информации здесь о контейнерах STL и интеллектуальных указателях:
, Почему он неправильно для использования станд.:: auto_ptr< > со стандартными контейнерами?
Лучший способ сделать это 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.
Вам определенно нужно написать свой собственный 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>
Эта информация будет удалена при удалении пользователя (например, при выходе из системы).