Spring Security Access UserDetailsService из более глубоких слоев - PullRequest
3 голосов
/ 06 февраля 2011


У меня есть следующая реализация UserDetailsService.
Пока что процесс аутентификации работает отлично.
Как сохранить мой "компонент MyUser" (, который успешно вошел в систему ) в«сеанс», чтобы я мог получить доступ к нему в других областях в моем приложении

Спасибо.

@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {


    private EmployeesApi employeesApi = new EmployeesApi();

    /**
     * Retrieves a user record containing the user's credentials and access. 
     */
    public UserDetails loadUserByUsername(String userName)
            throws UsernameNotFoundException, DataAccessException {

        // Declare a null Spring User
        UserDetails user = null;

        try {


            MyUser employee = employeesApi.getByUserName(userName);



            user =  new User(
                    employee.getUserName(), 
                    employee.getPassword().toLowerCase(),
                    true,
                    true,
                    true,
                    true,
                    getAuthorities(1) );

        } catch (Exception e) {
            logger.error("Error in retrieving user");
            throw new UsernameNotFoundException("Error in retrieving user");
        }


    }
    ....

1 Ответ

6 голосов
/ 06 февраля 2011

Spring Security уже хранит для вас UserDetails аутентифицированного пользователя в сеансе.

Итак, самый простой способ сохранить MyUser в сеансе - реализовать пользовательский UserDetails, содержащий ссылку на MyUser:

public class MyUserDetails extends User {
    private MyUser myUser;
    public MyUserDetails(..., MyUser myUser) {
        super(...);
        this.myUser = myUser;
    }
    public MyUser getMyUser() {
        return myUser;
    }
    ...
}

и верните его из вашего UserDetailsService:

MyUser employee = employeesApi.getByUserName(userName);
user =  new MyUserDetails(..., myUser);

Тогда вы можете легко получить доступ к MyUser через контекст безопасности:

MyUser myUser = ((MyUserDetails) SecurityContextHolder
    .getContext().getAuthentication().getPrincipal()).getMyUser();

В контроллере Spring MVC:

@RequestMapping(...)
public ModelAndView someController(..., Authentication auth) {
    MyUser myUser = ((MyUserDetails) auth.getPrincipal()).getMyUser();
    ...
}

В JSP:

<security:authentication var = "myUser" property="principal.myUser" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...