使用Spring Security Grails插件编码密码

时间:2015-10-04 23:11:16

标签: grails spring-security grails-plugin

在我的Grails 2.5.1项目中,我正在使用spring-security-core:2.0-RC5插件并收到此错误:

static public class ManageData {
    static Weather weather;
    static public Weather getData(){
        return weather;
    }
    static public void putData(Weather forecast) {
        weather = forecast;

    }
}

这是我的BootStrap:

Weather forecast = splash_activity.ManageData.getData();

我缺少什么?

1 个答案:

答案 0 :(得分:3)

问题是def springSecurityService的位置。正如你声明的那样,它是init闭包的局部变量。它不是依赖注入的候选者,因此没有任何内容初始化它并且它是空的。

要使用依赖注入,请将bean声明为类范围属性,而不是局部变量(闭包或方法)。这样做的原因是Groovy编译器将属性声明转换为具有getter和setter的私有字段。 Spring没有对Groovy属性的任何支持,但是当有一个与bean名称一致的setter方法时,它可以按名称自动装配(这是Grails的默认值)。因此,由于Groovy编译器为您添加了void setSpringSecurityService(springSecurityService)方法,所以Spring会看到它并调用它,因为方法"属性" name匹配您想要的bean。如果声明一个局部变量,则完全忽略它。

所以你的代码应该是这样的:

def springSecurityService

def init = { servletContext ->
    ...
}

但是接下来你会遇到代码的第二个问题。假设您尚未更改User课程中的自动哈希逻辑,那么您将进行两次编码。一旦进入BootStrap,再次进入域类。如果你这样做,没有人能够进行身份验证。选择一个 - 显式哈希,就像您正在执行并从域类中删除代码,或保留域类代码并只设置明文密码。如果你选择选项#2,你的代码(也清理使用findOrSaveBy并用一个替换所有那些不必要的急切同花顺)应该看起来像

class BootStrap {

    def init = {
        def userRole = SecurityRole.findOrSaveByAuthority('ROLE_USER')
        def adminRole = SecurityRole.findOrSaveByAuthority('ROLE_ADMIN')

        def user = new User(username: 'user' ,password: '123').save()
        def admin = new User(username: 'admin' ,password: '1234').save()
        SecurityUserSecurityRole.create(user, userRole)
        SecurityUserSecurityRole.create(admin, adminRole)

        User.withSession { it.flush() }
    }
}

更好的方法是将此代码移至事务性服务。这留给读者练习。