Spring Security はロールベースの認可には優れていますが、ルールベースの認可に関しては不十分なようです。確かに、SpEL を介してそれを行う方法はありますが、複数の場所で同じロジックを使用できるように、そのロジックをサービスに引き出す方がはるかに優れている場合、そのルートに行くと、アノテーション内に承認ロジックがロックされるようです。
独自のSpEL式を追加する方法はいくつかある ようですが、注目することは特に明確であり、私にとって意味のあるものでさえ不十分なようです。Groovy の柔軟性を考えると、依存関係を一緒にハードコーディングする必要はなく、セキュリティ ルール (または SpEL 拡張機能) を実行時に取得する何らかの方法が必要であると思います。
理想的ではありませんが、必要な新しいルールをすべて定義し、ミックスインとして挿入する (つまり、SecurityExpressionRoot.mixin MyRule1
) という一見単純に見えるものでさえ、良い出発点になるでしょうが、うまくいかないようです。
これを行う例を知っている人はいますか?そうでない場合、どうすれば自分でこれを行うことができますか?
1 つの (簡略化された) 例: ユーザーは、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) {
...
}
}
そして、それはより単純なルールの 1 つです。