Программно войти в систему пользователя, используя Spring Security - PullRequest
58 голосов
/ 26 октября 2011

Противоположность: Как вручную выйти из системы с помощью Spring Security?

В моем приложении у меня есть Зарегистрировать новый пользовательский экран , который отправляет сообщения наКонтроллер, который создает нового пользователя в БД (и делает несколько очевидных проверок). Затем я хочу, чтобы этот новый пользователь автоматически вошел в систему ... Я хотел бы получить что-то вроде этого:

SecurityContextHolder.getContext().setPrincipal(MyNewUser);

Edit Ну, я почти реализовал на основе ответа на Как программно войти в систему пользователя с помощью Spring Security 3.1

 Authentication auth = new UsernamePasswordAuthenticationToken(MyNewUser, null);
 SecurityContextHolder.getContext().setPrincipal(MyNewUser);

Однако, когда развернутый JSP не может получить доступ к моейMyNewUser.getWhateverMethods() тогда как при обычной процедуре входа в систему.код, который работает номинально, но выдает ошибку при входе в систему, как показано ниже:

<sec:authentication property="principal.firstname" /> 

Ответы [ 3 ]

36 голосов
/ 26 октября 2011

В моем контроллере у меня есть это, которое регистрирует пользователя в как обычно :

Authentication auth = 
  new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());

SecurityContextHolder.getContext().setAuthentication(auth);

Где пользователь - это мой пользовательский объект пользователя (реализующий UserDetails), который был недавно создан. Метод getAuthorities() делает это (только потому, что все мои пользователи имеют одинаковую роль):

public Collection<GrantedAuthority> getAuthorities() {
        //make everyone ROLE_USER
        Collection<GrantedAuthority> grantedAuthorities = new ArrayList<GrantedAuthority>();
        GrantedAuthority grantedAuthority = new GrantedAuthority() {
            //anonymous inner type
            public String getAuthority() {
                return "ROLE_USER";
            }
        }; 
        grantedAuthorities.add(grantedAuthority);
        return grantedAuthorities;
    }
27 голосов
/ 27 февраля 2013

Вы также можете внедрить вашу настроенную пружину безопасности UserDetailsManager на свой контроллер и использовать ее для получения UserDetails, который содержит принципала и полномочия, чтобы избежать дублирования кода:

// inject

@Autowired
private UserDetailsManager manager; 

// use in your method

UserDetails userDetails = manager.loadUserByUsername (token.getUsername ());
Authentication auth = new UsernamePasswordAuthenticationToken (userDetails.getUsername (),userDetails.getPassword (),userDetails.getAuthorities ());
SecurityContextHolder.getContext().setAuthentication(auth);
10 голосов
/ 26 октября 2011

Из источника безопасности пружины AbstractAuthenticationProcessingFilter:

protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
        Authentication authResult) throws IOException, ServletException {

    if (logger.isDebugEnabled()) {
        logger.debug("Authentication success. Updating SecurityContextHolder to contain: " + authResult);
    }

    // you need this
    SecurityContextHolder.getContext().setAuthentication(authResult);

    rememberMeServices.loginSuccess(request, response, authResult);

    if (this.eventPublisher != null) {
        eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
    }

    successHandler.onAuthenticationSuccess(request, response, authResult);
}

Обратите внимание, что SecurityContextHolder обычно очищается после завершения цепочки фильтров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...