gpt4 book ai didi

grails - 使用 Spring Security Grails 插件编码密码

转载 作者:行者123 更新时间:2023-12-02 15:00:10 25 4
gpt4 key购买 nike

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

Error initializing the application: Cannot invoke method encodePassword() on null object

这是我的 Bootstrap :
class BootStrap {

def init = { servletContext ->
def springSecurityService
def userRole = SecurityRole.findByAuthority("ROLE_USER") ?: new SecurityRole(authority:"ROLE_USER").save(flush:true)
def adminRole = SecurityRole.findByAuthority("ROLE_ADMIN") ?: new SecurityRole(authority:"ROLE_ADMIN").save(flush:true)

def user = new User(username:"user" ,password:springSecurityService.encodePassword("123"),enable:true ).save(flush:true)
def admin = new User(username:"admin" ,password:springSecurityService.encodePassword("1234"),enable:true ).save(flush:true)
SecurityUserSecurityRole.create(user, userRole)
SecurityUserSecurityRole.create(admin, adminRole)
}
def destroy = {
}
}

有什么我想念的吗?

最佳答案

问题是 def springSecurityService 的位置.正如您声明的那样,它是 init 的局部变量关闭。它不是依赖注入(inject)的候选对象,因此没有初始化它并且它为空。

要使用依赖注入(inject),请将 bean 声明为类范围属性,而不是局部变量(闭包或方法)。这样做的原因是 Groovy 编译器将属性声明转换为带有 getter 和 setter 的私有(private)字段。 Spring 不支持 Groovy 属性,但是当有一个与 bean 名称一致的 setter 方法时,它可以按名称 Autowiring (这是 Grails 的默认设置)。因此,由于 Groovy 编译器添加了 void setSpringSecurityService(springSecurityService)方法,Spring 看到它并调用它,因为方法的“属性”名称与您想要的 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() }
}
}

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

关于grails - 使用 Spring Security Grails 插件编码密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com