GrailsSpring安全UI
我是Grails新手,我正在尝试构建一个简单的帮助台应用程序。我希望能够注册新用户、登录、发布请求/事件、将其保存到数据库,并且从管理员的角度来看,我希望能够查看表中的所有请求/事件,并更改用户的权限。 对于安全部分(和安全管理),我考虑使用SpringSecurity和SpringSecurityUI插件。 现在,我已经创建了应用程序,安装了SpringSecurity及其UI扩展,添加了realname、电子邮件和公司属性。当我运行应用程序时,我会成功注册,当我通过电子邮件确认注册时,我会自动登录,但当我尝试使用其他浏览器登录时,我会出现以下错误: 很抱歉,我们找不到具有该用户名和密码的用户 但数据库中有一个 另外,我想拥有,比如说事件域类,我将在其中保存所有事件/请求数据。用户和事件域类之间的关系将是一对多。我只是像其他关系一样实现它,还是因为用户是由SpringSecurity实现的,所以我必须做一些特殊的事情?GrailsSpring安全UI,grails,spring-security,Grails,Spring Security,我是Grails新手,我正在尝试构建一个简单的帮助台应用程序。我希望能够注册新用户、登录、发布请求/事件、将其保存到数据库,并且从管理员的角度来看,我希望能够查看表中的所有请求/事件,并更改用户的权限。 对于安全部分(和安全管理),我考虑使用SpringSecurity和SpringSecurityUI插件。 现在,我已经创建了应用程序,安装了SpringSecurity及其UI扩展,添加了realname、电子邮件和公司属性。当我运行应用程序时,我会成功注册,当我通过电子邮件确认注册时,我会自
我愿意接受任何建议。最新的spring security核心与spring security ui 0.1.2之间存在不兼容。特别是,spring security core将密码编码移动到
用户
类中的beforeInsert
/beforeUpdate
事件处理程序中<代码>注册表控制器。spring security ui中的register控制器还不知道这一点,并尝试再次对其进行编码,从而生成双重编码的密码。要修复此问题,请覆盖寄存器控制器
,并将寄存器
操作更改为:
def register = { RegisterCommand command ->
if (command.hasErrors()) {
render view: 'index', model: [command: command]
return
}
def user = lookupUserClass().newInstance(email: command.email, username: command.username,
password: command.password, accountLocked: true, enabled: true)
if (!user.validate() || !user.save()) {
// TODO
}
def registrationCode = new RegistrationCode(username: user.username).save()
String url = generateLink('verifyRegistration', [t: registrationCode.token])
def conf = SpringSecurityUtils.securityConfig
def body = conf.ui.register.emailBody
if (body.contains('$')) {
body = evaluate(body, [user: user, url: url])
}
mailService.sendMail {
to command.email
from conf.ui.register.emailFrom
subject conf.ui.register.emailSubject
html body.toString()
}
render view: 'index', model: [emailSent: true]
}
正在跟踪此问题
关于第二个问题,您可以像对待任何其他域对象一样对待您的用户类。当您使用
s2 quickstart
脚本将Spring安全性添加到grails项目时,会自动为用户和角色创建域类。这些是普通的域类,所以您可以向用户类添加任何您想要的内容(比如事件列表)
要在运行时获取当前记录的用户域对象,请使用
springSecurityService.currentUser
这个问题已经在“org.grails.plugins:springsecurityui:1.0-RC3”中修复。默认情况下,spring security ui不会对密码进行编码
以下是grails spring Security UI文档中的描述及其问题解决方案。搜索标题为“密码哈希”的部分
“在最新版本的Spring Security Core插件中,“用户”域类为Gene。此选项默认为由s2 quickstart脚本使用代码进行错误设置,以自动散列密码。这使代码更简单(例如,在创建用户或更新用户密码的控制器中)但是较旧的生成类没有此生成的代码。这对类似于此的插件来说是一个问题,因为无法可靠地确定域类是否散列密码,或者您是否使用显式调用springSecurityService.encodePassword()的较旧方法
将执行密码哈希的较新域类与调用springSecurityService.encodePassword()的控制器混合使用的不幸后果密码被双重散列,用户无法登录。因此,为了避免这种情况,您可以设置一个配置选项,告诉该插件的控制器是否散列:grails.plugin.springsecurity.ui.encodePassword
此选项默认为false,因此,如果您有一个不处理哈希的旧域类,只需启用此插件的哈希:
grails.plugin.springsecurity.ui.encodePassword=true“只需在Config.groovy中添加grails.plugins.springsecurity.ui.encodePassword=false行,就可以防止双重编码