Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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安全UI_Grails_Spring Security - Fatal编程技术网

GrailsSpring安全UI

GrailsSpring安全UI,grails,spring-security,Grails,Spring Security,我是Grails新手,我正在尝试构建一个简单的帮助台应用程序。我希望能够注册新用户、登录、发布请求/事件、将其保存到数据库,并且从管理员的角度来看,我希望能够查看表中的所有请求/事件,并更改用户的权限。 对于安全部分(和安全管理),我考虑使用SpringSecurity和SpringSecurityUI插件。 现在,我已经创建了应用程序,安装了SpringSecurity及其UI扩展,添加了realname、电子邮件和公司属性。当我运行应用程序时,我会成功注册,当我通过电子邮件确认注册时,我会自

我是Grails新手,我正在尝试构建一个简单的帮助台应用程序。我希望能够注册新用户、登录、发布请求/事件、将其保存到数据库,并且从管理员的角度来看,我希望能够查看表中的所有请求/事件,并更改用户的权限。 对于安全部分(和安全管理),我考虑使用SpringSecurity和SpringSecurityUI插件。 现在,我已经创建了应用程序,安装了SpringSecurity及其UI扩展,添加了realname、电子邮件和公司属性。当我运行应用程序时,我会成功注册,当我通过电子邮件确认注册时,我会自动登录,但当我尝试使用其他浏览器登录时,我会出现以下错误:

很抱歉,我们找不到具有该用户名和密码的用户

但数据库中有一个

另外,我想拥有,比如说事件域类,我将在其中保存所有事件/请求数据。用户和事件域类之间的关系将是一对多。我只是像其他关系一样实现它,还是因为用户是由SpringSecurity实现的,所以我必须做一些特殊的事情?
我愿意接受任何建议。

最新的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行,就可以防止双重编码