ruby on rails 3 -设计者和当前用户



我已经设置了设计来管理我的应用程序的身份验证。

我有一个Category模型,用户可以在其中创建自己的类别。用户has_many:类别。这个模型有一个user_id属性,所以当有人登录并进入类别/索引时,例如,从控制器查询将使用current_user带来类别。Id,用来过滤带哪些。

到目前为止,直接和工作良好,似乎没有人能够看到别人的类别,但说实话,除非我错过了什么,这似乎有点不安全。我怎么知道黑客不会发现并发送修改参数的请求呢?

这是可能的还是我多疑了?此外,我可能没有正确使用功能?

如果您使用userscategories之间的正确关系,即

# in User.rb
has_many :categories
# in Category.rb
belongs_to :user

你应该能够在你的控制器中使用这样的东西:

@categories = current_user.categories

这样,不管传递了什么参数,你都在使用当前用户,它只会得到他们的图库。您不再使用可能不安全的user_id进行搜索。

如果你担心有人能够查看一个不是他们的类别,你可以添加你自己的私人方法类似于:authenticate_user!,以确保正在显示或编辑的类别实际上属于当前用户,在一个before_filter中运行它像另一个,并重定向,如果他们没有权限。

  private
  def authenticate_owner!
    if user_signed_in? && current_user.id == params[:id] # or something similar
      return true
    end
    redirect_to root_url,
      :notice => "You must have permission to access this category."
    return false
  end

我认为您已经为一对一(每个用户一个类别)而不是一对多(每个用户多个类别)设置了关系。如果在User模型中有一个category_id,那么下面应该是您的设置。

# in User.rb
belongs_to :category
# in Category.rb
has_many :users
# in CategoriesController
@category = current_user.category

如果您希望每个用户有多个类别,那么我建议使用user_idcategory_id的链接表(作为UserCategory模型)。

# in UserCategory.rb
belongs_to :user
belongs_to :category
# in User.rb
has_many :user_categories
has_many :categories, :through => :user_categories
# in Category.rb
has_many :user_categories
has_many :users, :through => :user_categories

然后,在您的Category控制器中,您可以使用上面的代码来获取给定用户的所有类别。

# in CategoriesController.rb
@categories = current_user.categories

根据Josh的回答,我把它变成了if else语句。我将params[:id]转换为整数,因为current_user.id返回1。

class UsersController < ApplicationController
  before_filter :authenticate_owner!
  #....
  private
  def authenticate_owner!
    if user_signed_in? && current_user.id == params[:id].to_i
      return
    else
      redirect_to root_url, :notice => "You must have permission to access this page."
    end
  end
end

相关内容

  • 没有找到相关文章

最新更新