Spring Security Как проверить правильность учетных данных формы входа? - PullRequest
1 голос
/ 12 апреля 2011

Как поступить, если я хочу проверить правильность учетных данных?

Например, я хочу убедиться, что имя пользователя является действительным (действительный адрес электронной почты, ограниченный размер и т. Д.), Чтобы я мог отобразить ошибку пользователю, даже не пытаясь выполнить аутентификацию с помощью Spring Security.

1) Убедитесь, что учетные данные действительны до аутентификации 2) Аутентификация 3) Рок-н-ролл

Кстати, я использую Spring Security 3.1.0 RC.

Заранее благодарю за помощь, Аднан

Обновление : На самом деле я говорю о проверке : о том, что имя пользователя указано в правильном формате электронной почты, или о том, что пароль имеет длину не менее 8 символов и т. Д. Только когда я уверен, что он находится в «допустимом» формате, я отправлю его в авторизацию и авторизацию Security, иначе я просто хочу снова отобразить форму входа с сообщением об ошибке (например: «пароль должен содержать не менее 8 символов») ).

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Вы можете пропустить проверку при входе в систему и выполнять проверку только при регистрации / редактировании профиля / смене пароля. Когда они пытаются войти с неверным именем пользователя / паролем, он просто не будет найден.

Я вижу два способа сделать то, что ты хочешь. Обычно страница входа в систему отправляется в / j_spring_security_check с j_username и j_password. UsernamePasswordAuthenticationFilter перехватывает этот POST и делегирует AuthenticationManager и его AuthenticationProviders (обычно DaoAuthenticationProvider).

Если вы действительно хотите выполнить проверку до того, как она попадет на любой код Spring Security, вам нужно будет добавить фильтр перед UsernamePasswordAuthenticationFilter и выполнить проверку там.

В качестве альтернативы можно создать подкласс DaoAuthenticationProvider и переопределить retreiveUser (). В retrieveUser () выполните дополнительную проверку, выдав исключение, если проверка завершилась неудачей.

Настройте свой подкласс в качестве поставщика аутентификации следующим образом:

<authentication-manager>
  <authentication-provider ref='myAuthenticationProvider'/>
</authentication-manager> 
0 голосов
/ 28 февраля 2015

Если ваша среда поддерживает Servlet 3.0+, вы можете использовать HttpServletRequest.login(username, password) в своем методе контроллера.

0 голосов
/ 12 апреля 2011

Хорошо, я нашел способ проверки полей формы с помощью аннотаций валидатора hibernate @Email & NotNull и так далее:

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;

public class LoginForm
{
    @Email
    @Size(min = 4, max = 128)
    private String username;

    @NotBlank
    @Size(min = 4, max = 128)
    private String password;

    ...

}

Часть «Безопасность» была немного хитрой, потому что мне пришлось вручную проходить аутентификацию с использованием authenticManager, а контекст безопасности не хотел обновлять текущий сеанс:

@Autowired
@Qualifier("authenticationManager")
private AuthenticationManager authenticationManager;

@RequestMapping(method = RequestMethod.POST)
public String processForm(@Valid LoginForm loginForm, BindingResult result, HttpServletRequest request, Model model)
{
    // Display errors in loginForm if not valid
    if (result.hasErrors())
        return "login";

    try
    {
        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(loginForm.getUsername(), loginForm.getPassword());
        Authentication auth = authenticationManager.authenticate(token);
        SecurityContextHolder.getContext().setAuthentication(auth);

        // for some reason, security context is NOT setting the auth key in session
        // so I had to put it here myself!
        HttpSession session = request.getSession();
        session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());

        return "redirect:/index";
    }
    catch (AuthenticationException e)
    {
        SecurityContextHolder.getContext().setAuthentication(null);
        String errorMessage = e.getLocalizedMessage();
        model.addAttribute("errorMessage", errorMessage);
        return "loginerror";
    }
}

Обязательно укажите псевдоним для диспетчера аутентификации, чтобы можно было автоматически подключать его <security:authentication-manager alias="authenticationManager">

Надеюсь, что кому-то поможет :)

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