春季安全是偉大做基於角色的授權,但它似乎功虧一簣,當談到基於規則的授權。當然,有些方法可以通過SpEL來實現,但是通過這種方式似乎會將註釋鎖定在註釋中,因爲將邏輯拉出到服務中會更好,因此多個位置可以使用相同的邏輯。如何在Grails中使用Spring Security進行基於規則的授權?
似乎有成爲一些waystogoabout在自己的規劃環境地政司表達增加,但關注的是特別清楚,即使是那些意義,我似乎功虧一簣。我想,給出如何靈活 Groovy是,有必須是一種不必一起硬編碼的依賴關係,而是在運行時獲得安全規則(或SpEL擴展)。
雖然不理想,但即使像定義所有需要的新規則和注入mixin(即SecurityExpressionRoot.mixin MyRule1
)這樣看起來很簡單的東西也是一個好的開始,但這似乎並不奏效。
有誰知道這樣做的例子嗎?如果沒有,我怎麼可以自己做這件事呢?
一(簡化的)例子:用戶只能採取的特定動作與對象如果3 4的字段具有超過特定閾值的值,但僅當對象是(即執行服務的方法。)少於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) {
...
}
}
而這是一個更簡單的規則。
就像我在我的問題中所說的那樣,基於角色的授權(哪些ACL只是更精細的版本)在您需要的時候非常棒,而Spring Security擅長這一點。不幸的是,我的要求比基於角色的輕鬆處理要複雜得多。 SpEL規則更多的是我所追求的,但我需要能夠在應用程序中的多個位置獲得相同的複雜規則,並且SpEL規則的複製粘貼不能是最好的方式。 – cdeszaq
Imho ACL不是一個更加細化的基於角色的系統。它允許您定義允許誰在對象上執行特定操作的權限(獨立於任何角色)。你能舉一個你複雜規則的例子嗎? – micha
一個示例(簡化):如果4個字段中的3個字段的值超過特定閾值,但只有該對象小於3天時,用戶才能使用對象執行特定操作(即執行服務方法)。這是更簡單的規則之一。 – cdeszaq