2010-07-05 59 views
2

在我的應用程序中,我有一個「用戶」模型,其中包括一些屬性,包括「has_admin_rights」。如果爲true,則用戶是管理員,如果爲false,則不是。防止用戶使自己的管理員

每個用戶都有一個配置文件,用自己的登錄名,電子郵件地址,個人資料相片等

如果我登錄作爲一個普通用戶,我可以點擊一個名爲「個人資料」頁面上,並我可以編輯自己的帳戶,例如更新我的電子郵件地址,個人資料圖片,密碼,等等。我只能編輯我的帳戶,而不能使用其他帳戶。

如果我以管理員身份登錄,我可以做更多:例如,我可以讓另一個用戶成爲管理員,或拿走他們的管理員權限。

現在,只有管理員才能訪問「make admin」複選框出現的視圖,但我有一種感覺,僅僅限制對視圖的訪問是不夠的。

我擔心的是,因爲任何用戶都可以編輯他們自己的配置文件,那裏有什麼來阻止用戶提交自定義表單帖子,其中包含他們的「has_admin_rights」=>「1」參數自己的帳戶 - 從而授予他們自己的管理權限?

我在想的是,在用戶控制器中,在對「has_admin_rights」字段應用任何更改之前,我需要檢查以確保發出請求的用戶當前是管理員 - 否則我會忽略完全要求,不作任何改變。

+3

你回答了你自己的問題。 UI的隱藏位不是安全措施,您必須始終檢查實際進入的請求,並在此時確定是否允許該請求。 – 2010-07-05 14:57:24

+0

甚至比完全忽略請求更好的方法是發出錯誤消息。你永遠不知道什麼時候它可能有助於調試一個問題! – 2010-07-06 04:43:39

回答

2
在用戶控制器

,應用任何更改爲「has_admin_rights」領域,我需要檢查,以確保發出請求的用戶是當前管理員之前 - 否則我完全忽略請求,並沒有變化。

是的,正好。永遠不要相信客戶;請記住,任何人都可以直接用Firebug或其他方式調整頁面。

我還建議你考慮添加一個審計跟蹤,並記錄一些管理員讓另一個用戶進入管理員的行爲。也許還可以發送電子郵件給特定組的所有管理員,讓他們知道已創建管理員(或該權限已被撤銷)。

+0

完美,謝謝。 – jefflunt 2010-07-05 15:12:57

+0

因此,除了您的建議之外,我決定創建一個「admin_activity」表,該表會跟蹤所有管理員操作,更改,刪除等,即使它不是用戶相關的。 對於某些操作(如用戶更改),它也會觸發電子郵件警報 - 完美的想法。 – jefflunt 2010-07-05 15:40:01

+1

謝謝!祝你好運。當電話響起時,您真的很感激審計日誌記錄,另一端有一個憤怒的人發誓:「但是我幾個月沒有觸及那個頁面!」 – Pointy 2010-07-05 15:52:37

0

在執行此驗證的User模型中添加before_save。

+0

那麼訣竅就是你還需要知道標誌的狀態*在動作修改用戶對象之前。也許你可以檢查Rails中對象的「更改」狀態;我不知道。 – Pointy 2010-07-05 15:01:22

0

Ue的attr_accessible該模型屬性的白名單,可以通過大規模分配設置

class User < ActiveRecord::Base 
    attr_accessible :has_admin_rights 
    end 

&在控制器

@user.has_admin_rights = current_user.is_admin? "1" : "0" 
+0

Salil,'attr_protected'黑名單可能是更好的選擇。每次添加用戶屬性時,他都不想修改「attr_accessible」白名單。 – 2010-07-05 17:28:07

1

attr_protected是非常有用的,太

class User < ActiveRecord::Base 

    attr_protected :is_admin 

end 
相關問題