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