Spring Security如何检查登录表单凭据是否有效?

时间:2011-04-12 10:16:48

标签: validation authentication spring-security

如果我想检查凭据是否有效,如何继续?

例如,我想确保用户名有效(有效的电子邮件,有限的大小等),因此我甚至可以在尝试使用Spring Security进行身份验证之前向用户显示错误。

1)确认凭据在身份验证之前有效 2)认证 3)Rock-n-roll

是的,我正在使用Spring Security 3.1.0 RC。

提前感谢您的帮助, 阿德南

更新: 实际上我在谈论 验证 :确保用户名是有效的电子邮件格式,或确保密码至少为8个字符,依此类推。 只有当我确定它是“有效”格式时,我才会将其提交给安全认证&授权否则我只想再次显示登录表单并显示错误消息(例如:“密码必须至少为8个字符”)。

3 个答案:

答案 0 :(得分:1)

您可能希望在登录时跳过验证,仅对注册/编辑个人资料/更改密码进行验证。当他们尝试使用错误的用户名/密码登录时,将无法找到它。

我可以看到两种方法来做你想做的事。通常,登录页面使用j_username和j_password POST到/ j_spring_security_check。 UsernamePasswordAuthenticationFilter拦截此POST并委托AuthenticationManager及其AuthenticationProviders(通常是DaoAuthenticationProvider)。

如果您确实想要在遇到任何Spring Security代码之前进行验证,则需要在UsernamePasswordAuthenticationFilter之前添加一个Filter并在那里进行验证。

或者,子类DaoAuthenticationProvider并覆盖retreiveUser()。在retrieveUser()中进行额外验证,如果验证失败则抛出异常。

将您的子类配置为身份验证提供程序,如下所示:

<authentication-manager>
  <authentication-provider ref='myAuthenticationProvider'/>
</authentication-manager> 

答案 1 :(得分:0)

如果您的环境支持Servlet 3.0+,则可以在控制器方法中使用HttpServletRequest.login(username, password)

答案 2 :(得分:-1)

好吧,我找到了一种使用hibernate验证器注释验证表单字段的方法@Email&amp; 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;

    ...

}

安全部分有点棘手,因为我必须手动对authenticationManager进行身份验证,而安全上下文不想更新当前会话:

@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">

希望能帮助某人:)

相关问题