2

当用户身份验证失败时,我希望将用户名和密码返回到表单。我正在使用带有 Grails 和 Spring Security LDAP 的 spring security core 插件。我已经搜索了一段时间并想出了zip。有任何想法吗?

4

3 回答 3

4

来自UsernamePasswordAuthenticationFilterjavadoc:

如果要保留用户名,请将其缓存在自定义的 AuthenticationFailureHandler 中

至于密码,没有必要缓存它,因为出于安全原因,它不能放回表单密码字段。

于 2012-10-23T21:16:59.987 回答
3

供将来参考,因为上面的答案要么太模糊,对我们这些刚开始第一次学习这个框架的人有帮助(提示这样的问题:什么是AuthenticationFailureHandler?我如何实现一个?我如何连接它是由命名空间处理程序神奇地创建的我现有的基础设施<security:http>?)或不再工作(存储用户名的代码SPRING_SECURITY_LAST_USERNAME已从UsernamePasswordAuthenticationFilter版本 3.1.0 中删除),这是第一个答案的更多细节:

  • 登录过程使用AnAuthenticationFailureHandler来决定身份验证失败时要执行的操作。
  • 提供的默认登录表单设置<security:http><security:form-login /></security:http>使用 aSimpleUrlAuthenticationFailureHandler执行对登录失败 url 的重定向(默认为/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);
    }
}

其配置如下:

    <security:form-login authentication-failure-handler-ref="authenticationFailureHandler" [...] />
    ...
<bean id="authenticationFailureHandler" class="my.package.UsernameStoringUrlAuthenticationFailureHandler" p:defaultFailureUrl="/LoginError" />

然后我可以使用与 James Kleeh 在此处的回答中描述的相同的方法访问失败的登录用户名,但由于框架的更改而不再有效。

于 2014-03-12T14:59:08.283 回答
0

我能够执行以下操作以将用户名返回到表单中:在 LoginController.groovy 中:

        render view: view, model: [postUrl: postUrl,
                               rememberMeParameter: config.rememberMe.parameter,
                               lastUsername: request.getSession().getAttribute("SPRING_SECURITY_LAST_USERNAME")]
于 2012-11-05T18:25:25.507 回答