Как программно войти в систему с помощью Spring Security 3.1 - PullRequest
11 голосов
/ 30 сентября 2011

Как правильно программно регистрировать веб-посетителя под определенным именем пользователя в Spring и Spring Security 3.1? Кажется, то, как я делал это под 2.5, немного изменилось. Я уверен, что сейчас есть гораздо лучший способ сделать это.

По сути, когда я создаю нового пользователя, мне необходимо одновременно регистрировать его.

Ответы [ 4 ]

18 голосов
/ 01 октября 2011

Создайте Authentication (обычно UsernamePasswordAuthenticationToken) и затем вызовите

SecurityContextHolder.getContext().setAuthentication(authentication)
4 голосов
/ 19 декабря 2012

Эти три строки кода делают работу за меня:

        Authentication request = new UsernamePasswordAuthenticationToken( username, password );
    Authentication result = authenticationManager.authenticate( request );
    SecurityContextHolder.getContext().setAuthentication( result );
2 голосов
/ 19 июня 2014

Если вы заинтересованы в этом для целей тестирования, вы можете сделать это:

    UserDetails user = _userService.loadUserByUsername(username);
    TestingAuthenticationToken token = new TestingAuthenticationToken(user,null);
    SecurityContextHolder.getContext().setAuthentication(token);

Где пользовательский сервис - это ваша вещь, которая реализует UserDetailsService

0 голосов
/ 01 октября 2011

Вы можете написать custom UsernamePasswordAuthenticationFilter, который расширяет UsernamePasswordAuthenticationFilter.

Spring. Вот код:

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.WebAuthenticationDetails;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CustomUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException {
        super.successfulAuthentication(request, response, authResult);
        UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authResult;
        WebAuthenticationDetails details = (WebAuthenticationDetails) token.getDetails();
        String address = details.getRemoteAddress();
        User user = (User) authResult.getPrincipal();
        String userName = user.getUsername();
        System.out.println("Successful login from remote address: " + address + " by username: "+ userName);
    }

    @Override
    protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) throws IOException, ServletException {
        super.unsuccessfulAuthentication(request, response, failed);
        UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) failed.getAuthentication();
        WebAuthenticationDetails details = (WebAuthenticationDetails) token.getDetails();
        String address = details.getRemoteAddress();
        System.out.println("Failed login try from remote address: " + address);
    }
}
...