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

Posted

技术标签:

【中文标题】返回用户名和密码以登录表单grails spring security【英文标题】:Return username and password to login form grails spring security 【发布时间】:2012-10-13 17:06:22 【问题描述】:

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

【问题讨论】:

【参考方案1】:

来自UsernamePasswordAuthenticationFilterjavadoc:

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

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

【讨论】:

此外,这并不是您在大多数网站上看到的。 我实际上越来越多地看到它,只需擦除您不小心输入的最后一个字符非常方便【参考方案2】:

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

登录进程使用AuthenticationFailureHandler 来决定身份验证失败时的操作。 <security:http><security:form-login /></security:http> 提供的默认登录表单设置使用SimpleUrlAuthenticationFailureHandler 执行重定向到登录失败的 url(默认为/spring_security_login?login_error)。 您可以使用<form-login> 元素的authentication-failure-handler-ref 属性来挂钩您自己的实现。

所以,我的实现如下所示:

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 在此处的回答中描述的相同方法访问失败的登录用户名,但由于框架的更改而不再有效。

【讨论】:

【参考方案3】:

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

        render view: view, model: [postUrl: postUrl,
                               rememberMeParameter: config.rememberMe.parameter,
                               lastUsername: request.getSession().getAttribute("SPRING_SECURITY_LAST_USERNAME")]

【讨论】:

SPRING_SECURITY_LAST_USERNAME 已弃用。 你能给我指出任何按照你的建议做的例子吗?我正在为如何做到这一点而苦苦挣扎。 只需实现AuthenticationFailureHandler接口并配置spring-security即可使用。 这仍然有很多问题没有得到解答。举个例子就好了。 你试过了吗?什么不工作?无论如何,这对我来说似乎是另一个问题。

以上是关于返回用户名和密码以登录表单grails spring security的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security 在身份验证之前预检查普通密码

Grails OpenLDAP 登录失败:抱歉,我们无法找到具有该用户名和密码的用户

Grails OAuth2 登录密码凭据授予返回 invalid_client

Grails:ShiroSecurity - 登录没有用户名密码令牌的用户

使用 Grails 和 Acegi 自动登录

Grails 3 和 Spring Security:当用户未登录时返回 401