2017-04-17 57 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的网页上找到。