设计和当前用户

时间:2011-04-27 14:08:43

标签: ruby-on-rails-3 devise

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

我有一个分类模型,用户可以在其中创建自己的类别。用户has_many:类别。此模型具有user_id属性,因此当有人登录并转到类别/索引时,例如,来自控制器的查询将使用current_user.id来过滤掉要带来的类别。

到目前为止直截了当且运作良好,似乎没有人能够看到别人的类别,但说实话,除非我遗漏了某些东西,否则这似乎有点不安全。我怎么知道一些黑客不会弄清楚并发送他自己的修改params的请求?

这是可能还是我是偏执狂?另外,我可能没有正确使用该功能?

3 个答案:

答案 0 :(得分:2)

如果您使用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

答案 1 :(得分:1)

我认为您的关系设置为一对一(每个用户一个类别)而不是一对多(每个用户多个类别)。如果category_id型号中有User,则应设置以下内容。

# in User.rb
belongs_to :category

# in Category.rb
has_many :users

# in CategoriesController
@category = current_user.category

如果您希望每个用户拥有多个类别,那么建议您使用UserCategoryuser_id的链接表(模型category_id)。

# 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

答案 2 :(得分:0)

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

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