Spring Security 3.1.1 - Настройка проблем входа в систему

Я новичок в Spring Security, и я читаю API и Javadocs, и я считаю, что мне нужна помощь по моей проблеме.

До сих пор, основываясь на методе проб и ошибок, я обнаружил, что генерирование исключения заставляет метод authenticate автоматически перенаправлять в обработчик ошибок входа. Оттуда было легко перенаправить и настроить поток неудачной аутентификации. Тем не менее, когда дело доходит до успешного входа в систему, я не могу передать что-либо обработчику успешной регистрации, кроме объектов HttpServletRequest, HttpServletResponse, Authentication.

Мой успех при входе в систему имеет два сценария:

  1. Вход в систему успешно.

  2. Вход нового пользователя должен быть перенаправлен на страницу смены пароля.

Вот несколько вопросов:

  1. В этом случае можно вызывать request.setParameter("status", "FOR_CHANGE_PASSWORD")? Это безопасно?

  2. Должен ли я добавить полномочия "CHANGE_PASSWORD"? Это хорошая практика?

Моя проблема в том, что я не хочу вызывать метод userService в моем LoginAuthenticator, а затем вызывать его снова в моем обработчике успешного входа в систему только для того, чтобы получить статус пользователя. Любая работа вокруг?

public class LoginAuthenticator implements AuthenticationProvider{
private static final Logger log = LoggerFactory.getLogger(LoginAuthenticator.class);
private static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();
@Autowired
UserService userService;

@Override
public Authentication authenticate(Authentication authentication)
        throws AuthenticationException {
    log.info("Authenticating...");   

    log.debug("Username: {}" , authentication.getPrincipal());
    log.debug("Password: {}" , (String) authentication.getCredentials()); 


    WSResponse response = userService.authenticateLogin(username, password);


    //User log-in failure
    if(response.getResponseCode != 200){  

          if(response.getResponseStatus.equals("BAD CREDENTIALS")){
             throw new BadCredentialsException("Bad Credentials");  
          }
          else{
             throw new AccountStatusException("Account is locked")
          } 
    } 
    else{
        log.info("User credentials are valid... logging in");
        AUTHORITIES.add(new SimpleGrantedAuthority("USER"));
        return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(),          (String) authentication.getCredentials(), AUTHORITIES);

    } 


}

Любые дополнительные предложения будут великолепны.

1 ответ

Решение

Типичный подход - хранить всю необходимую информацию о зарегистрированном пользователе в своем Authentication,

Например, стандарт AuthenticationProviderтакие как DaoAuthenticationProvider хранить реализацию UserDetails как principal при строительстве Authentication объект после успешной аутентификации, и разработчик приложения может предоставить свой собственный подкласс UserDetails это включает в себя необходимую информацию. Вы можете реализовать это таким же образом.

Другие вопросы по тегам