Spring Security非常适合进行基于角色的授权,但在基于规则的授权方面似乎有所不足。当然,有一些方法可以通过 SpEL 来实现,但走这条路似乎会将您的授权逻辑锁定在注释中,而将逻辑提取到服务中会更好,以便多个地方可以使用相同的逻辑。
似乎有一些 方法 可以添加 你 自己的 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) {
...
}
}
这是更简单的规则之一。