0

如果我在Rails中設置了一個基本的User模型,並給它一個is_admin:boolean, default: false屬性,那麼防止非管理員用戶改變它的最好方法是什麼?如何只允許管理員設置管理員權限?

這似乎是應該真正進入模型的那種邏輯,但構建它的最好方法是什麼? ActiveRecord回調函數?

我知道我可以把它放到控制器的#update方法中,但這似乎不符合MVC最佳實踐。 (並且似乎不太便攜。)

這裏最好的方法是什麼?

+0

對於其他上下文,假設我完全按照本教程:http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=asciicast –

回答

1

使用重定向拒絕訪問對於控制器來說是一個完美的工作,所以在私有的before_filter方法中做到這一點就足夠了,我認爲是合理的。

1

爲什麼你說邏輯應該在模型中去?

這取決於您的實施。如果邏輯取決於current_user(即當前的管理員可以將另一個用戶設置爲管理員),那麼邏輯應該放在控制器中。由於您所標記的問題作爲軌道4,邏輯會在允許的PARAMS在你的控制器:

a = User.find_by(email: "[email protected]") 
a.toggle!(:admin) 

你會阻止:

def user_params 
    if current_user.is_admin 
    params.require(:user).permit(...your attributes here with is_admin...) 
    else 
    params.require(:user).permit(...your attributes here without is_admin...) 
    end 
end 
+0

我在想它應該在型號,這樣數據庫完整性不依賴於控制器。也就是說,這是應該強制執行適當的數據庫更新邏輯的模型。我想管理員的財產只能通過控制器進行更改? –

+0

不確定你的意思是「數據庫完整性不依賴於控制器」,但是你的整個應用程序依賴於控制器,所以你的數據庫依賴於控制器。在這種情況下,您的控制器不負責更新記錄,但負責傳遞給模型的內容,然後模型根據傳遞給記錄的內容更新記錄。 – AbM

+0

有道理。總的來說,Rails是否會擁有更胖的控制器?在這一點上,我所有的邏輯都是控制器端的,模型中沒有任何東西。從我記得我的Java時代(很久以前),我們學會盡可能地將模型放入模型中,並且它絕不應該允許不正確的操作。在這種情況下,允許更新用戶而不驗證它是明確進行更新的管理員。軌道是否不遵循這個經驗法則? –

1

我只會在控制檯一樣,設置管理員權限有人破解您的網站以獲取管理員權限。

+0

謝謝 - 我認爲這是我現在要做的。 –