Ruby on rails RubyonRails:如何阻止用户更改url以查看其他用户';s页?

Ruby on rails RubyonRails:如何阻止用户更改url以查看其他用户';s页?,ruby-on-rails,authorization,Ruby On Rails,Authorization,我得到了它,这样客户页面上的show视图就可以链接到他们下的所有订单。当他们单击“显示”时,它会将他们带到该订单的显示视图。但是,如果他们要更改url中订单的id,则可以查看其他人的订单。请有人提供帮助或建议我的方法,这样,如果有人试图查看他们已被定向到的订单以外的订单,他们将被重定向到他们的客户页面?我可以使用以下方法使重定向位正常工作: redirect_to customers_path(session[:customer_id]) 但我如何让应用程序确保客户只能查看该订单?我似乎不能使

我得到了它,这样客户页面上的show视图就可以链接到他们下的所有订单。当他们单击“显示”时,它会将他们带到该订单的显示视图。但是,如果他们要更改url中订单的id,则可以查看其他人的订单。请有人提供帮助或建议我的方法,这样,如果有人试图查看他们已被定向到的订单以外的订单,他们将被重定向到他们的客户页面?我可以使用以下方法使重定向位正常工作:

redirect_to customers_path(session[:customer_id])

但我如何让应用程序确保客户只能查看该订单?我似乎不能使用那种逻辑来检查订单id是否等于url中的订单id,因为这将永远被证明是正确的

一个好的解决方案是首先删除相应的路线和视图。相反,为用户创建某种页面,以查看他或她自己的订单

我不确定您使用的是哪个用户身份验证gem,但如果您使用的是designe,您可以编写如下代码:

<% current_user.orders.each do |order| %>
  <%= render order %>
<% end %>

如果希望保留当前视图和路由层次结构,可以在用户页面上使用此代码

<% if current_user.eql?(@user) %>
  <%= # show order history %>
<% end %>


如果不使用Deviate,我想写一个当前的用户助手方法来实现相同的功能不会太困难。

假设您的订单模型有一些“谁拥有这个订单”的概念,通常通过一个名为
用户id
的整数列,您可以检查
会话[:customer\u id]
等于订单。用户id(或任何您称之为的名称)

您通常会将此授权代码保存在控制器中

class OrdersController
  ...

  def show
    @order = Order.find params[:id]
    unless session[:customer_id] == @order.user_id
      flash[:notice] = "You don't have access to that order!"
      redirect_to customers_path(session[:customer_id])
      return
    end
  end

  ...
end

随着应用程序变得越来越复杂,您可能会研究授权gem来处理此逻辑。

我建议添加一个授权gem,例如CanCan,它允许您设置用户是否有权执行某些操作(例如编辑订单、查看订单等)。这可能在很多方面派上用场;您可能希望拥有客户永远无法访问的管理页面(例如,用于添加新产品)

一旦你准备好了,你就可以限制客户的访问权限,让他们只能查看或编辑自己的订单。在CanCan中,您创建了一个名为abilities.rb的类,该类类似于:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can [:read, :update], Order, :user_id => user.id
    end
  end
end

关于
can[:read,:update],Order,:user\u id=>user.id
意味着“如果Order.user\u id==user.id,(非管理员)用户可以读取或更新订单”(即当前用户的id)。

您还可以检查授权插件。更好的做法是设计它,以便您也可以用于其他功能。不要依赖客户端参数来查找用户的身份。此处的更多信息:

使用Deviate的当前用户帮助程序对@BinaryMuse的解决方案进行轻微修改,“如果”条件和不同的比较运算符(!=)

就我而言,你是作家吗?检查用户是否可以修改订单
user_denied是一种具有重定向和警报功能的方法,基本上,您需要创建Rails管理员或用户管理员,并向其添加验证,但需要在这些验证上设置管理员角色--


添加admin时,将布尔值设置为false(默认值)

我建议从CanCan开始。如果你养成了使用
load_和\u authorize_resource
的习惯,那么提前添加它会更容易,并且会发现一些地方你可能会忘记授权检查。事实上,我正在尝试向现有的应用程序添加功能,以便自己学习如何做一些事情-不幸的是,考虑到gems,构建起来太晚了,但是下次我会考虑使用CanCan,谢谢。正如你在这里看到的,CanCan不再积极开发。改用
def show
@order = Order.find params[:id]
 if current_user.id != @order.user_id
    flash[:notice] = "MEAN MESSAGE HERE!"
    redirect_to orders_path(session[:current_user])
    return
  end
end
(current_user.id == params[:id].to_i || is_writer?) || user_denied
def set_admin

end 

before_action set-admin only :[:destroy, :update]