2011-10-31 100 views
3

我是新来的Grails,我试图构建一个简单的帮助台应用程序。我希望能够注册一个新用户,登录,发布请求/事件,将其保存到数据库,并且从管理员端我希望能够查看表中的所有请求/事件,并更改用户的权限。 对于安全部分(和安全管理),我正在考虑使用Spring安全性& Spring安全性UI插件。 现在我已经创建了应用程序,安装了spring security和它的UI扩展,添加了真实姓名,电子邮件和公司属性。当我运行应用程序,我设法成功注册,当我确认从电子邮件注册我自动登录,但当我尝试使用不同的浏览器登录时,我得到以下错误:Grails spring安全UI

“对不起,我们是无法找到具有该用户名和密码的用户“

但是在数据库中有一个。

此外,我想让我们说,事件域类,我会坚持所有事件/请求数据。用户与事件域类之间的关系将是一对多关系。我是否像其他任何关系一样实现它,还是我必须做一些特殊的事情,因为用户是由Spring Security实现的? 我打开任何建议。

回答

2

最新的spring-security-core与spring-security-ui 0.1.2是不兼容的。特别是,spring-security-core将密码编码移入User类中的事件处理程序中的beforeInsert/beforeUpdateRegisterController.register spring-security-ui中的控制器还不知道,并尝试再次对其进行编码,从而产生双重编码的密码。要修复,覆盖RegisterController,改变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] 
} 

这个问题正在跟踪的http://jira.grails.org/browse/GPSPRINGSECURITYUI-27

关于你的第二个问题,你可以像对待任何其他域对象一样对待你的User类。

+0

非常感谢!解决了这个问题 – drago

+0

只需将行grails.plugins.springsecurity.ui.encodePassword = false添加到Config.groovy即可防止双重编码 –

2

当您使用s2-quickstart脚本将Spring Security添加到您的grails项目中时,会自动创建用户和角色的域类。这些是正常的域类,所以你可以添加任何你想要的(如事件列表)到用户类。

要获得当前登录用户的域对象在运行时,使用

springSecurityService.currentUser

0

此问题已修复“org.grails.plugins:弹簧安全的UI:1.0 RC3”。 spring-security-ui默认不会对密码进行编码。

下面是从grails spring Security UI文档中描述问题的方法和解决方案。题为“密码哈希”搜索部分

http://grails-plugins.github.io/grails-spring-security-ui/v1/guide/customization.html

“在最近版本的Spring Security核心插件,‘用户’域类是geneThis选项默认为与代码falserated由S2-快速入门脚本自动散列密码,这使代码更简单(例如,在创建用户或更新用户密码的控制器中),但较早生成的类没有此生成的代码。这对像这样的插件提出了一个问题,因为无法可靠地确定域类是否散列密码,或者如果使用显式调用springSecurityService.encodePassword()的较旧方法。

混合使用密码散列的较新域类与调用springSecurityService.encodePassword()的控制器相混合的不幸后果是密码变为双重散列,且用户无法登录。所以为了解决这个问题,你可以设置一个配置选项来告诉这个插件的控制器是否进行散列:grails.plugin.springsecurity.ui.encodePassword。

此选项默认为false,所以如果你有不处理散列刚刚启用该插件的散列的旧域类:

grails.plugin.springsecurity.ui.encodePassword =真正的”