如何使用Grails中的Spring Security进行基于规则的授权?

cde*_*zaq 9 grails spring-security spring-el

Spring Security 非常适合进行基于角色的授权,但在涉及基于规则的授权时似乎无法实现.当然,有很多方法可以通过SpEL来实现,但是当将更多的逻辑输出到服务中以便多个地方可以使用相同的逻辑时,走这条路线似乎会将您的授权逻辑锁定在注释中.

似乎有一些 方法 ,以 在自己的规划环境地政司表达增加,但关注的是特别清楚,即使是那些意义,我似乎功亏一篑.我认为,考虑到Groovy的灵活性,必须有一些方法可以不必将依赖项硬编码在一起,而是在运行时获取安全规则(或SpEL扩展).

虽然不理想,但即使是像定义所有期望的新规则并注入as mixins(即.SecurityExpressionRoot.mixin MyRule1)这样看似简单的事情也是一个好的开始,但这似乎不起作用.

有谁知道这样做的例子?如果没有,我怎么可能自己这样做呢?


一个(简化)示例:如果4个字段中的3个具有超过特定阈值的值,则用户只能对对象执行特定操作(即执行服务方法),但仅当对象少于3天时:

class MyRule {

    boolean canTakeAction(Person person, MyThing myThing) {
        int numFieldsWithValues = 0
        if (myThing.field1 != null) { numFieldsWithValues++ }
        if (myThing.field2 != null) { numFieldsWithValues++ }
        if (myThing.field3 != null) { numFieldsWithValues++ }
        if (myThing.field4 != null) { numFieldsWithValues++ }

        return (numFieldsWithValues > 3) && (ageInDays(myThing) < 3)
    }

    int ageInDays(MyThing myThing) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个更简单的规则.

mic*_*cha 2

基于角色的授权是最简单但灵活性较差的方法。与此形成对比的是Spring security ACL系统。ACL 允许您精确定义可以在运行时对哪个对象执行什么操作。另一方面,这需要更复杂的设置。还有一个grails 插件可以解决这个问题

将注释与 SpEL 表达式一起使用的方式介于这两种选择之间。它们比简单角色更灵活,并且比 ACL 更容易。如果您正在寻找 Grails 中方法安全性的介绍,也许我之前写的这篇博文可以帮助您。