Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-安全地更新用户信息_Ruby On Rails_Login - Fatal编程技术网

Ruby on rails Rails-安全地更新用户信息

Ruby on rails Rails-安全地更新用户信息,ruby-on-rails,login,Ruby On Rails,Login,在许多书籍和教程中,我看到人们在users controller中实现update方法,通过params[:id]或session[:id]查找用户数据。然而,我觉得可以简单地修改会话或地址栏,侵入其他人的帐户并修改他/她的信息。因此,我如何确保用户只能更新自己的信息,而不能更改其他信息 答案是特定于应用程序的。您需要首先“查找”该记录,其中如何查找该记录的详细信息取决于应用程序 是的,正如您所指出的,您不应该盲目地实例化记录并更新它。在公开相关记录进行更新之前,您的业务逻辑需要智能地查找相关记

在许多书籍和教程中,我看到人们在users controller中实现
update
方法,通过params[:id]或session[:id]查找用户数据。然而,我觉得可以简单地修改会话或地址栏,侵入其他人的帐户并修改他/她的信息。因此,我如何确保用户只能更新自己的信息,而不能更改其他信息

答案是特定于应用程序的。您需要首先“查找”该记录,其中如何查找该记录的详细信息取决于应用程序


是的,正如您所指出的,您不应该盲目地实例化记录并更新它。在公开相关记录进行更新之前,您的业务逻辑需要智能地查找相关记录。

将用户模型与任何其他模型一样对待,并向其添加身份验证,并要求用户在uddate方法内登录(例如,某些身份验证方法的当前用户)

if current_user
  update_stuff and redirect
else
  :notice => 'Not authd' and redirect
end 

我曾经在处理一些需要保密的应用程序时遇到过这个问题。我所做的是使用rails,并配合伟大的rails实践。我用Desive进行认证,cancan进行授权

在某些情况下,您可以使用隐藏的_字段在表单中传递用户id。我建议在控制器创建操作中传递用户\u id,并且在使用Desive时,您可以访问当前用户方法,该方法将仅基于当前用户会话和id创建模型

使用cancan保护用户信息。例如,如果我只能向用户显示这样的照片,而用户2看不到这些照片

@photos = current_user.photos #only grabs current users photos
有了cancan,我可以通过这样做来阻止用户手动输入像users/2/edit这样的url

能力.rb

can :manage, Photo, :user_id => user.id
load_and_authorize_resource :photo

def index
  authorize! :index, @photo
end
控制器.rb

can :manage, Photo, :user_id => user.id
load_and_authorize_resource :photo

def index
  authorize! :index, @photo
end

实际上,我已经围绕这个主题做了大量的应用程序构建/研究,因此我将尝试给出详细的答案

通过同样的方式,您可以在非用户、登录用户和管理员帐户之间划分应用程序或网站的部分,您可以实施检查以确保(例如)只有正确的用户可以更改其帐户密码。以下是您可能用于此方法的测试:

describe "as wrong user" do
  let(:user) { FactoryGirl.create(:user) }
  let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
  before { sign_in user, no_capybara: true }

  describe "submitting a GET request to the Users#edit action" do
    before { get edit_user_path(wrong_user) }
    specify { expect(response.body).not_to match(full_title('Edit user')) }
    specify { expect(response).to redirect_to(root_url) }
  end

  describe "submitting a PATCH request to the Users#update action" do
    before { patch user_path(wrong_user) }
    specify { expect(response).to redirect_to(root_url) }
  end
 end
end
如果您是测试新手(或不确定具体做什么),我将解释:

在代码中,工厂可以选择(下面这一行)

这基本上会创建一个与默认电子邮件地址不同的用户。然后所有发生的事情就是测试指定错误的用户不应该有权访问原始用户的编辑或更新操作

下一步是添加before过滤器来检查当前用户的状态。这可能会出现在您的
users\u controller.rb
文件中

before_action :correct_user,   only: [:edit, :update]
然后,第二步(仍然在users_controller.tb文件中)创建一个私有方法,检查当前用户是否有修改数据的权限,否则将其重定向回根url(如果您希望,您可以使用[:notice]表示“您无权访问应用程序的此部分”或类似内容)

正确的用户筛选器使用您在会话帮助器中定义的
当前用户?
布尔方法,如下所示:

def current_user
remember_token = User.encrypt(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end

def current_user?(user)
user == current_user
end

当涉及到谁可以访问什么时,这并不是安全的全部教条,但我希望它能为您提供您问题中提到的缺失细节。

[这里您可以找到您问题的一些答案][1][1]:破解会话一点也不简单。