Авто логин с весенней безопасностью - PullRequest
5 голосов
/ 05 июля 2011

У меня есть приложение, которое использует Spring-Security.В моем процессе регистрации новый пользовательский объект сохраняется с паролем HASHED, электронное письмо, содержащее токен активации, отправляется пользователю.Щелчок по этому токену направляет пользователя к UserActivationServlet, который ищет пользователя по токену, активирует пользователя и перенаправляет его в приложение.Я хотел бы автоматически войти в приложение пользователя и включить этот метод в свой сервлет, чтобы сделать это

    private void authenticateUserAndSetSession(HttpServletRequest request, User u) {
    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
            u.getUsername(), u.getPassword()); //PROBLEM: THIS PASSWORD IS HASHED

    // generate session if one doesn't exist
    request.getSession();

    token.setDetails(new WebAuthenticationDetails(request));
    Authentication authenticatedUser = authenticationManager.authenticate(token);

    SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
    request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
            SecurityContextHolder.getContext());
}

Проблема здесь в том, что поле пароля на объекте пользователя было хэшировано, когда оно былосоздано.Таким образом, единственный другой вариант, который я могу придумать, - это передать хэш-пароль в качестве параметра запроса сервлету (неприятно!)

Я что-то пропустил, есть ли другой способ предварительной аутентификации пользователя?

Спасибо

Ответы [ 2 ]

3 голосов
/ 05 марта 2013

Пользователь нажал на ссылку активации, и мы его разыскали так ясно, что у нас есть действительный пользователь, поэтому нет необходимости повторно аутентифицировать его с помощью authenticationManager, и, следовательно, нет необходимости использовать учетные данные при созданииТокен, просто создайте его следующим образом:

PreAuthenticatedAuthenticationToken token = new PreAuthenticatedAuthenticationToken( p, null, p.getAuthorities());
0 голосов
/ 05 июля 2011

Если я правильно вас понимаю SOA может вам помочь.

Вам не нужно перенаправлять на страницу входа в систему, а просто вызывать сервис, который регистрирует пользователя. Любая логика, связанная с входом, находящаяся в контроллере (или где-то выше уровня сервиса), должна быть перемещена «вниз» и используется вашим сервлетом.

Сервис может выглядеть примерно так:

public interface LoginService {
    // this will be called from the login page
    public void login(String username, String hashedPass);

    // this will only be visible to other services
    // you can secure it with AOP and Spring security's method security
    public void login(String username);
}

Тогда вы можете позвонить loginService.login(username); со своего сервлета.

Или в вашем конкретном случае передайте свой токен без пароля:

loginService.login(new UsernamePasswordAuthenticationToken(u.getUsername(), ""));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...