如果我想检查凭据是否有效,如何继续?
例如,我想确保用户名有效(有效的电子邮件,有限的大小等),因此我甚至可以在尝试使用Spring Security进行身份验证之前向用户显示错误。
1)确认凭据在身份验证之前有效 2)认证 3)Rock-n-roll
是的,我正在使用Spring Security 3.1.0 RC。提前感谢您的帮助, 阿德南
更新: 实际上我在谈论 验证 :确保用户名是有效的电子邮件格式,或确保密码至少为8个字符,依此类推。 只有当我确定它是“有效”格式时,我才会将其提交给安全认证&授权否则我只想再次显示登录表单并显示错误消息(例如:“密码必须至少为8个字符”)。
答案 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">
希望能帮助某人:)