我正在尝试创建一个带有spring-security内核3.0.4的grails 3.1.2网站。
我使用过这个页面:Grails Spring安全核心
我使用了以下脚本(将"网站"替换为我的项目名称):
grails s2-quickstart com.website User Role
grails s2-create-persistent-token com.website.PersistentLogin
grails s2-create-role-hierarchy-entry com.website.RoleHierarchyEntry
然后我在BootStrap.groovy中添加了以下内容:
if(User.count()==0) {
Date testDate = new Date()
Role userRole = new Role('ROLE_USER').save()
Role adminRole = new Role('ROLE_ADMIN').save()
User user = new User("John","password").save()
User admin = new User("Richard","password").save()
UserRole.create(admin, adminRole)
UserRole.create(user, userRole)
UserRole.withSession {
it.flush()
it.clear()
}
assert User.count() == 2
assert Role.count() == 2
assert UserRole.count() == 2
}
我收到一个错误,无法找到Userbean类的权限,所以我用以下内容替换了getAuthorities方法(因为将其添加到瞬态列表中不起作用):
Set<Role> getAuthorities() {
if(this.id){
return UserRole.findAllBySecUser(this)*.role
}
else{
return [] as Set
}
}
然后我尝试再次构建,并收到一个关于UserRole类的异常。
ERROR org.springframework.boot.SpringApplication - Application startup failed
org.codehaus.groovy.runtime.metaclass.MethodSelectionException: Could not find which method <init>() to invoke from this list:
public com.website.UserRole#<init>(org.springsource.loaded.C)
public com.website.UserRole#<init>(com.website.User, com.website.Role)
at groovy.lang.MetaClassImpl.chooseMethodInternal(MetaClassImpl.java:3197) ~[groovy-2.4.6.jar:2.4.6]
at groovy.lang.MetaClassImpl.chooseMethod(MetaClassImpl.java:3134) ~[groovy-2.4.6.jar:2.4.6]
at groovy.lang.MetaClassImpl.createConstructorSite(MetaClassImpl.java:3434) ~[groovy-2.4.6.jar:2.4.6]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallConstructorSite(CallSiteArray.java:91) [groovy-2.4.6.jar:2.4.6]
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60) [groovy-2.4.6.jar:2.4.6]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235) [groovy-2.4.6.jar:2.4.6]
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247) [groovy-2.4.6.jar:2.4.6]
at com.website.UserRole.create(UserRole.groovy:55) ~[main/:na]
我该如何克服他的错误?我不知道这个特定的错误意味着什么:/
看起来用户有一个验证错误,没有保存。您使用的是2-arg构造函数,但如果除了用户名和密码之外还有更多必需的属性,则验证将失败,save()
将返回null。
如果您更改代码以创建用户
User user = new User(..., ...)
user.save()
if (user.hasErrors()) {
println user.errors
}
然后你就会发现出了什么问题。在构造函数调用后添加缺少的属性:
User user = new User(..., ...)
user.fullName = '...'
或者切换到传统的Map构造函数,在一行中初始化它:
User user = new User(username: ..., password: ..., fullName: ...)