当用户验证失败时,我希望将用户名和密码返回到表单。 我正在使用带有Grails和Spring Security LDAP的spring安全核心插件。我已经搜索了一会儿,并提出了拉链。有什么想法吗?
答案 0 :(得分:4)
来自UsernamePasswordAuthenticationFilter
javadoc:
如果要保留用户名,请将其缓存在自定义的AuthenticationFailureHandler
中
对于密码,没有必要对其进行缓存,因为出于安全原因,无法将其放回到密码字段中。
答案 1 :(得分:2)
为了将来的参考,因为上述答案要么太模糊,要么对我们刚刚开始学习这个框架的人有所帮助(提示这样的问题:什么是{{1}我如何实现一个?如何将它连接到由AuthenticationFailureHandler
命名空间处理程序神奇创建的现有基础架构?)或不再工作(在<security:http>
中存储用户名的代码是自版本3.1.0起SPRING_SECURITY_LAST_USERNAME
已删除),这里有关第一个答案的详细信息:
UsernamePasswordAuthenticationFilter
来确定身份验证失败时要执行的操作。AuthenticationFailureHandler
提供的默认登录表单设置使用SimpleUrlAuthenticationFailureHandler
执行重定向到登录失败的网址(默认为<security:http><security:form-login /></security:http>
)。/spring_security_login?login_error
元素的authentication-failure-handler-ref
属性来挂接自己的实现。所以,我的实现看起来像这样:
<form-login>
配置如下:
public class UsernameStoringUrlAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler
{
@Override
public void onAuthenticationFailure (HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException
{
request.getSession (true).setAttribute ("SPRING_SECURITY_LAST_USERNAME", request.getParameter ("j_username"));
super.onAuthenticationFailure (request, response, exception);
}
}
然后我可以使用与James Kleeh的回答相同的方法访问失败的登录用户名,但由于框架的更改而不再有效。
答案 2 :(得分:0)
我能够执行以下操作以将用户名返回到表单:在LoginController.groovy中:
render view: view, model: [postUrl: postUrl,
rememberMeParameter: config.rememberMe.parameter,
lastUsername: request.getSession().getAttribute("SPRING_SECURITY_LAST_USERNAME")]