Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GrailsSpring安全自定义登录表单-错误消息在哪里?_Grails_Spring Security - Fatal编程技术网

GrailsSpring安全自定义登录表单-错误消息在哪里?

GrailsSpring安全自定义登录表单-错误消息在哪里?,grails,spring-security,Grails,Spring Security,我不熟悉Grails。我已经配置了SpringSecurity插件Core2.0RC2。我可以使用存储在数据库中的用户登录。我已经配置了自定义登录表单,当我尝试在未登录的情况下访问安全URL时,我会被重定向到自定义表单。但是,当我使用错误的密码或不存在的登录时,我无法显示错误消息 我的Grails.config中有以下代码片段: grails.plugin.springsecurity.auth.loginFormUrl = '/user/login' grails.plugin.springs

我不熟悉Grails。我已经配置了SpringSecurity插件Core2.0RC2。我可以使用存储在数据库中的用户登录。我已经配置了自定义登录表单,当我尝试在未登录的情况下访问安全URL时,我会被重定向到自定义表单。但是,当我使用错误的密码或不存在的登录时,我无法显示错误消息

我的Grails.config中有以下代码片段:

grails.plugin.springsecurity.auth.loginFormUrl = '/user/login'
grails.plugin.springsecurity.failureHandler.defaultFailureUrl  = '/user/login'
这似乎奏效了。我确实成功地恢复了状态。我正在使用插件附带的默认LoginController

我已在我的表格上尝试了以下所有内容:

<g:eachError>
    <li><g:message error="${it}"/></li>
</g:eachError>
<g:eachError>
    <li>${it}</li>
</g:eachError>
<g:if test="${flash.message}">
    <li> class="error">${flash.message}</li>
</g:if>

,但当显示“我的页面”时,它们似乎消失了。我可以看到错误事件被引发,因为我已经创建了一个安全事件监听器来记录它们。Grails和Spring安全专家,我缺少什么?

我建议使用flash.error,它会将错误消息放入flash范围。大概是这样的:

if (exception instanceof AccountExpiredException) {
        flash.error = g.message(code: "springSecurity.errors.login.expired")
}
那么在普惠制中,您将需要以下内容:

<g:if test="${flash.error}">
<div class="errors">
    <ul><li>${flash.error}</li></ul>
</div>

  • ${flash.error}

我有两个问题。SecurityEventListener是一个Springbean,而不是grails组件。如何从Spring访问flash对象?我已经在谷歌上搜索过了,但没有找到解决方法。另外,SpringSecurity插件似乎已经做到了这一点,SpringSecurity是否做了一些额外的重定向,使其超出范围?我找到了问题2的答案。如果更改默认失败url,将永远不会调用LoginController中添加消息的authfail()方法。似乎您需要保持该设置不变,然后在处理authfail()后,它应该重定向到您配置的登录url,就像默认gsp一样,但它没有这样做。我只是编辑了默认的LoginController.groovy,将authfail()改为重定向到我的自定义表单,而不是默认表单。这似乎应该来自配置,而不是代码,但也许我缺少一个配置。这应该在grails控制器中,它可以访问flash范围。您不是在使用来自控制器的Springbean吗?我假设您所指的登录控制器可以访问flash范围,因为您已经在使用消息进行操作。Grails使用约定优先于配置,因此您不一定会错过任何配置。如果该插件允许您使用“grails.plugin.springsecurity.auth.loginFormUrl”配置自定义登录表单,为什么它不会自动重定向到此配置表单以显示错误?谁希望在第一次尝试登录时使用自定义表单,但在后续尝试时使用提供的表单?我原以为默认的authfail方法会使用相同的配置。最后我确实编写了自己的登录控制器,覆盖了插件中的登录控制器,并且可以正常工作。
<g:if test="${flash.error}">
<div class="errors">
    <ul><li>${flash.error}</li></ul>
</div>