2009-05-20 87 views
1

我有一個我正在構建的系統,似乎需要一些複雜的規則,而不是在整個系統中混亂的規則。我期待集中整個過程。 (這可能不是我所擁有的最聰明的主意)如何在Ruby on Rails中實現複雜的安全規則

我最(也許是最不重要的)想法是在保存到數據庫之前使用單獨的類來檢查任何對象,並將其與各種字段中的允許值列表。它非常緊密地綁定到數據庫結構上,而且易於測試和易於維護。規則

例子:

  • 主持人可以提出意見與主持人狀態,但沒有管理的狀態。
    • Comments.status只能是正常或管理員(admin是保留給管理員)
  • 用戶不能修改意見主持人值
    • Comments.status只能是正常,Comments.display只能是正常
  • 只有管理員才能暫停用戶帳戶衆多領域的
    • 列表
  • 只有管理員可以修改其他用戶帳戶對與邏輯域
    • 限制,以確定當前用戶擁有的行
  • 只有付費帳戶的用戶才能執行X,Y和Z.

我遇到的問題是我在哪裏放這個邏輯。這對於rails驗證來說太複雜了。如果我只查看登錄用戶的狀態,實施這些規則中的一部分就很困難或不可能實現。目前的解決方案是創建一個安全類,它將接受數據庫對象和用戶,並允許或不允許執行操作。

如果我遵循這一行動的過程,實施將是討厭的。現在,我看着這樣的事情

#For every field on an object passed to Security::allow?(user, object), call this private method 
def allow_helper?(user, object, field) 
    perm = permissions[user.rank][object.class.name][field] 
    if perm.is_a? Array 
      perm.include? object.send(field) 
    else 
      perm 

這是會很快成爲維護的噩夢。這是我夢寐以求的夢魘的替代選擇。在我編碼之前,我停下了腳步。

+0

可能有助於解釋爲什麼這太複雜的驗證,這似乎是一個明顯的答案。 – kajaco 2009-05-20 22:44:06

+0

我想我認爲使用安全驗證會混合邏輯,我不想混合。也許這不是我認爲會是的問題。 – epochwolf 2009-05-21 00:26:34

回答

0

你爲什麼不創建一個Permissions模型,然後只需如果user.permissions.find(:permission_name_here)看到當你設計驗證和意見?