簡體   English   中英

在webapp中建模用戶約束的最佳實踐?

[英]Best practices in modelling user constraints in a webapp?

我正在使用Acegi(Spring)安全性構建一個基於角色的訪問控制的webapp。 所以我有不同的用戶角色: ROLE_ADMINROLE_USER等。
但是,我需要實現各種用戶約束。

我們來看一個例子:

假設有一個用戶可以在線觀看電影的網站。 有些用戶的角色為ROLE_STANDARD_USERROLE_VIP_USER 標准用戶每周可以觀看3部電影,貴賓用戶可以每周觀看10部電影,還可以享受其他一些特權。 標准用戶組中有一個用戶,我希望每周額外提供2部電影。 允許的電影數量有時可能會改變。
此外,有各種類型的電影:幻想,喜劇,經典,新電影等。我希望一些用戶,無論他們的角色,只能訪問某些類別。 可以動態創建和刪除類別。

是否有任何標准實踐來實現此類用戶約束?
可以/應該使用Spring Security角色和權限嗎?
或者我需要考慮在我的應用程序中添加基於規則的引擎?

謝謝。

編輯:
上面的例子是虛構的,我的項目涉及授予學生遠程訪問各種網絡(和其他)設備。 但是,用戶約束的類型可能是相同的。
不幸的是,用戶訪問和約束的模型不完整和穩定。 在不久的將來,我可能會被告知要為用戶實施各種額外的限制,現在還不知道。
所以我想現在選擇一條路徑,以便將來增加或改變新的用戶約束,並且不需要對內部模型或數據庫結構進行重大改造。 如果可能的話。

編輯2

目前,基本用戶約束是硬編碼的(從原型系統中刪除)。 我想我會首先嘗試將它重構為某種參數化的業務服務對象,然后再考慮我可以從哪里開始。 我還將考慮使用Spring Security Authorization Decision Manager。

謝謝你的所有建議!

我不希望聲明性的基於角色的安全系統能夠提供您正在尋求的細粒度控制。 您已經描述了許多您想要實現的基於“業務規則”的訪問控制,並且隨着時間的推移,我們可能會期望這些規則變得更加復雜。 所以你需要安全子系統的信息組合(誰是這個請求的用戶?他們有什么角色?),然后以編程方式將其與業務數據和規則結合起來(如果今天的日期,該用戶有權獲得2部免費電影在這個范圍內)。

至少我會定義我封裝該業務邏輯的服務。 關於是否使用完全成熟的規則引擎的決定需要進一步研究。

在問自己之前,Acegi(或規則引擎等)是正確的做法,我認為你需要
准確,完整地分析您的需求

考慮到每個主題( 例如,可以看到的電影限制 ),有很多方法可以實現這一點,您需要做出功能選擇。 除非您已經詳細確定了必須做什么,否則可能沒有正確的實施!

滿足您需求的模型示例:

  • 根據以下總和限制每周一般電影的數量:
    • 角色(3或10)
    • 每用戶獎金(如果沒有提到,則默認為0)
  • 根據需要更新這些數字
  • 將電影限制為類別列表:
    • 如果為用戶指定了列表,請使用它
    • 否則,請使用為角色提供的列表

此示例有許多含義,在您的情況下可能是正確的或不可接受的。
啟示:

  • 更新數字后,立即更改限制。
  • 沒有每周限制的記憶,你不能問這個過去(以統計為例)
  • ...

假設這個模型不符合您的需求,您將面臨創建真正適合他們的模型的艱巨任務。 只有擁有它,然后考慮實施。

如果您考慮使用Spring Security,這是我認為您可以實施解決方案的一種方式。 實現AccessDecisionVoter以決定用戶的訪問權限。 這里查看參考源

另請參閱AccessDecisionVoter的[javadoc] [2]。 您可以通過實施vote方法來實施規則。

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

讓Spring處理訪問(身份驗證和授權)。 如果決策變得復雜,使用規則引擎可能是明智的。 讓投票方法調用規則引擎。 這提供了明確的職責分離。 讓Spring Security處理訪問,讓規則引擎計算規則。

[2]: http//static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote (org.springframework.security.Authentication,java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

聽起來你有身份驗證需求和授權需求 - 很多時候人們會讓兩者感到困惑和/或加入。 值得慶幸的是,Spring Security非常清楚地描繪了這兩個。 您的用戶將通過安全鏈進行身份驗證(無論是logj,openID,SSL X509),然后由您的業務特定選民(在您的AccessDecisionManagers中)授權完成,無論他們是否已經看到他們分配的號碼電影 如果需要在以后添加新的業務邏輯,那只需要編寫新的/更多的選民並將其注入您的經理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM