如果我打開Chrome開發者工具和插入毀壞的鏈接(容易做時,它是一個基於REST的應用程序,你知道的路線),那麼我可以很容易地從數據庫中刪除的東西未經授權。解決這個問題的最好方法是什麼?是否將CanCanCan樣式授權檢查中的控制器操作內容包裝在內?導軌 - 防止螢火/開發工具黑客
感謝
如果我打開Chrome開發者工具和插入毀壞的鏈接(容易做時,它是一個基於REST的應用程序,你知道的路線),那麼我可以很容易地從數據庫中刪除的東西未經授權。解決這個問題的最好方法是什麼?是否將CanCanCan樣式授權檢查中的控制器操作內容包裝在內?導軌 - 防止螢火/開發工具黑客
感謝
例如,寶石devise
提供helper控制器檢查認證(或您自己的解決方案,你可以做到這一點)。它可以幫助您避免來自未登錄用戶的請求。
CanCanCan或Pundit - 良好的解決方案來設置規則,允許一個用戶的動作。您可以根據這些資源的規則和操作來控制對不同資源的訪問。
CanCanCan例如
def delete
@post = Post.find_by(id: params[:id])
#authorize user to have an ability delete this post
#this will raise a CanCan::AccessDenied exception if not allowed
authorize! :destroy, @post
... your destroy logic
end
瞭解更多關於CanCanCan wiki page
感謝您的回答idej,但我實際上正在尋找更多關於實際實施的答案。你提到使用授權寶石,但我應該使用什麼代碼?我應該把摧毀/更新操作代碼放在CanCanCan中嗎? :管理'方法?還是有更好的方法來做到這一點? –
@DannySantos我在回答中添加了有用的鏈接和示例 – idej
這就是我一直在尋找的,謝謝idej!我在文檔中進一步挖掘並找到了'load_and_authorize_resource'方法,該方法將解決方案應用於每個操作。 –
這是很簡單的實際控制授權。例如在你的帖子控制器中。您創建before_actions:
class PostsController < ApplicationController
before_action :logged_in_user, only: [:create, :edit, :update, :destroy]
before_action :correct_user, only: [:edit, :update, :destroy]
def correct_user
@post = Post.find_by(id: params[:id])
unless current_user?(@post.user)
redirect_to user_path(current_user)
end
end
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in"
redirect_to login_url
end
end
end
正如您所看到的。當您嘗試刪除帖子時,before_action會啓動並檢查用戶是否已登錄。然後它檢查current_user是否擁有該帖子。只有在兩個條件都成立的情況下,它纔會讓用戶刪除帖子,否則它會重定向用戶。以同樣的方式處理需要授權的其他操作,如管理面板,銷燬用戶,更新帖子等。
至於授權本身,您可以使用bcrypt自己實現它,也可以使用專爲Devise設計的gem :
https://github.com/plataformatec/devise
所有的安裝說明,他們的GitHub的網頁上找到。
從服務器拉出網線。 – max