如果我打开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