2017-04-17 58 views
0

如果我打開Chrome開發者工具和插入毀壞的鏈接(容易做時,它是一個基於REST的應用程序,你知道的路線),那麼我可以很容易地從數據庫中刪除的東西未經授權。解決這個問題的最好方法是什麼?是否將CanCanCan樣式授權檢查中的控制器操作內容包裝在內?導軌 - 防止螢火/開發工具黑客

感謝

+1

從服務器拉出網線。 – max

回答

1
  1. 認證

例如,寶石devise提供helper控制器檢查認證(或您自己的解決方案,你可以做到這一點)。它可以幫助您避免來自未登錄用戶的請求。

  • 授權
  • CanCanCanPundit - 良好的解決方案來設置規則,允許一個用戶的動作。您可以根據這些資源的規則和操作來控制對不同資源的訪問。

    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

    +0

    感謝您的回答idej,但我實際上正在尋找更多關於實際實施的答案。你提到使用授權寶石,但我應該使用什麼代碼?我應該把摧毀/更新操作代碼放在CanCanCan中嗎? :管理'方法?還是有更好的方法來做到這一點? –

    +1

    @DannySantos我在回答中添加了有用的鏈接和示例 – idej

    +0

    這就是我一直在尋找的,謝謝idej!我在文檔中進一步挖掘並找到了'load_and_authorize_resource'方法,該方法將解決方案應用於每個操作。 –

    0

    這是很簡單的實際控制授權。例如在你的帖子控制器中。您創建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的網頁上找到。