如何在Spring-Security-Acl中创建ACL

时间:2013-03-09 15:37:34

标签: grails spring-security acl

我刚刚开始使用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)

1 个答案:

答案 0 :(得分:2)

所有属性都有一个隐式nullable:false约束,但您只设置title属性。未设置draft,因此验证失败,并且您的所有Position都为空。

这应该有效:

def position = new Position(title: "position$id", draft: false).save()