我已经设置了Devise来管理我的应用程序的身份验证。
我有一个分类模型,用户可以在其中创建自己的类别。用户has_many:类别。此模型具有user_id属性,因此当有人登录并转到类别/索引时,例如,来自控制器的查询将使用current_user.id来过滤掉要带来的类别。
到目前为止直截了当且运作良好,似乎没有人能够看到别人的类别,但说实话,除非我遗漏了某些东西,否则这似乎有点不安全。我怎么知道一些黑客不会弄清楚并发送他自己的修改params的请求?
这是可能还是我是偏执狂?另外,我可能没有正确使用该功能?
答案 0 :(得分:2)
如果您使用users
和categories
之间的正确关系,即
# 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
如果您希望每个用户拥有多个类别,那么建议您使用UserCategory
和user_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