返回登录表单的用户名和密码grails spring security

时间:2012-10-23 17:27:19

标签: grails spring-security

当用户验证失败时,我希望将用户名和密码返回到表单。 我正在使用带有Grails和Spring Security LDAP的spring安全核心插件。我已经搜索了一会儿,并提出了拉链。有什么想法吗?

3 个答案:

答案 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")]