Хорошо, я нашел способ проверки полей формы с помощью аннотаций валидатора 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">
Надеюсь, что кому-то поможет :)