Grails/Spring Security:无法使用新创建的用户登录

Posted

技术标签:

【中文标题】Grails/Spring Security:无法使用新创建的用户登录【英文标题】:Grails/Spring Security: Unable to login with a newly created user 【发布时间】:2011-10-31 01:41:47 【问题描述】:

我刚刚开始使用 grails 并安装了 spring-security 和 spring-security-ui 插件。我正在按照here 给出的教程进行操作。该应用程序以一个具有 ROLE_ADMIN 权限的引导用户 me 开始。

通过 UI 覆盖脚本,我能够启动并运行注册功能,并且一切正常。现在,我已经安装了用户管理脚本 (grails s2ui-override user) 来尝试添加、编辑、删除用户。

一个新用户创建得很好,我已经对照 HSQLDB 实例检查了这一点。但是,如果我现在从应用程序中注销并尝试使用新创建的用户登录,应用程序会告诉我它无法找到具有提供的用户名和密码的用户。

我没有修改默认注销处理,所以我使用/j_spring_security_logout,正如文档所说,这会使会话无效。

这是一个已知问题吗?如果是,我该如何解决这个问题,或者如果不是,我该如何调试这个问题?

编辑:

在没有添加 UI 的情况下,此问题也会持续存在。注册为新用户。完成电子邮件验证后,您将自动登录到该站点。现在注销并尝试再次登录。它给出了同样的错误。

最终编辑:

UI 插件带有仍然对密码进行编码的 RegisterController。但是,核心附带的较新的域类也这样做,建议的做法是控制器不应该这样做。我注释掉了执行编码的行,并且登录/注销现在至少适用于基本场景。

【问题讨论】:

你在注销后检查了HSQLDB吗?用户还在表中吗?对我来说听起来像是一个持久性问题 @imellan:是的,用户退出后仍然在表中。事实上,您可以重置密码(使用 spring security UI)并使用新密码重新登录。 你在进程中的某个地方使用 springSecurityService.encodePassword() 吗? 是的。我没有编辑标准示例。它在将密码存储到数据库之前对其进行编码。甚至代码的 UI 端也能做到这一点。 问题是,如果您使用的是最新版本的插件,在将密码存储到数据库时,它会自动进行 encodePassword()。如果你再做一次,它会重新加密密码,所以你无法登录 【参考方案1】:

该教程有警告

该插件的早期版本没有在域类中包含密码加密逻辑,但它使代码更简洁。

我猜 security-ui 插件不知道该更改,并将未加密的密码与数据库上的加密密码进行比较。

【讨论】:

我对此表示怀疑。请参阅我提到的其他场景。即使没有 UI 增强也会发生这种情况。 你是对的。 UI 插件不会随更改而更新。很棒的收获!我重新查看了 RegisterController,这是确切的问题!真希望我早点听你的。谢谢:) 不客气。不久前,我对 shiro 插件及其文档也有类似的问题。【参考方案2】:

我设法解决了我的问题。问题是双重加密。在第 41 行用户控制器中的 spring security ui 下,密码被加密,然后由域类再次加密,所以登录时它正在比较双重加密密码和单一加密密码。为了解决这个问题,我只是在用户控制器中注释掉了加密密码的第 41 行

编辑:如果你不知道去哪里编辑控制器,你可以在你的用户主页中找到下载插件的源代码

/.grails/version/projects/projectname/plugins

用于编辑的目录(至少在 Mac/Linux 上,不知道在 windows 的什么地方可以找到它)。

【讨论】:

我不确定深入插件目录并编辑文件是否是最好的方法。我更喜欢使用 s2ui 脚本覆盖受影响的类,并在覆盖的版本中进行必要的更改。

以上是关于Grails/Spring Security:无法使用新创建的用户登录的主要内容,如果未能解决你的问题,请参考以下文章

Grails/Spring Security:无法使用新创建的用户登录

Grails Spring Security Core无法登录

Grails Spring-Security-Core 插件 - 无法验证用户

由于重定向循环,Grails Spring Security 无法显示登录页面

休息资源的 Grails spring-security 静态规则似乎无法正常工作

Grails Spring Security注释问题