我刚刚开始使用Grails,并试图配置spring-security-acl插件。我一直在关注official plugin tutorial,但在尝试运行我的应用时(使用Position
域类而不是Report
类,我无法通过Bootstrapping阶段。我的大多数问题已经包围了应用程序的ACL部分。
我无法解决的问题出在grantPermissions()
Bootstrap.groovy
函数中。根据教程的说明,函数从这样开始:
private void grantPermissions() {
def positions = []
100.times {
long id = it + 1
def position = new Position(title: "position$id").save()
positions << position
aclService.createAcl(
objectIdentityRetrievalStrategy.getObjectIdentity(position))
}
IntelliJ在aclService.createAcl
行警告我它“无法推断参数类型。此检查报告具有不兼容类型的分配。”事实上,如果我试图运行该应用程序,它会在该行崩溃并出现错误:
| Error 2013-03-09 09:35:24,207 [localhost-startStop-1] ERROR context.GrailsContextLoader - Error initializing the application: Cannot get property 'id' on null object
Message: Cannot get property 'id' on null object
Line | Method
->> 68 | doCall in BootStrap$_grantPermissions_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 63 | grantPermissions in BootStrap
| 29 | doCall . . . . . . . . . . . . . in BootStrap$_closure1
...
非常感谢任何帮助!
附录
如果重要,我的Position
域对象如下所示:
class Position {
String title
Boolean draft
static constraints = {
}
}
我不认为这个问题是相关的,但这是与ACL相关的偏离教程,所以为了后人的缘故...我遇到的第一个问题(我认为)我已解决的是PositionService .groovy,我在代码块上的IntelliJ中遇到错误:
def acl = aclUtilService.readAcl(position)
// Remove all permissions associated with this particular
// recipient (string equality to KISS)
acl.entries.eachWithIndex { entry, i ->
if (entry.sid.equals(position) &&
entry.permission.equals(permission)) {
acl.deleteAce i
}
}
看起来问题是无法在通用deleteAce
对象上找到函数acl
;我能够通过在
MutableAcl
来解决这个问题
MutableAcl acl = aclUtilService.readAcl(position)
答案 0 :(得分:2)
所有属性都有一个隐式nullable:false
约束,但您只设置title
属性。未设置draft
,因此验证失败,并且您的所有Position
都为空。
这应该有效:
def position = new Position(title: "position$id", draft: false).save()