我已经设置了设计来管理我的应用程序的身份验证。
我有一个Category模型,用户可以在其中创建自己的类别。用户has_many:类别。这个模型有一个user_id属性,所以当有人登录并进入类别/索引时,例如,从控制器查询将使用current_user带来类别。Id,用来过滤带哪些。
到目前为止,直接和工作良好,似乎没有人能够看到别人的类别,但说实话,除非我错过了什么,这似乎有点不安全。我怎么知道黑客不会发现并发送修改参数的请求呢?这是可能的还是我多疑了?此外,我可能没有正确使用功能?
如果您使用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
我认为您已经为一对一(每个用户一个类别)而不是一对多(每个用户多个类别)设置了关系。如果在User
模型中有一个category_id
,那么下面应该是您的设置。
# in User.rb
belongs_to :category
# in Category.rb
has_many :users
# in CategoriesController
@category = current_user.category
如果您希望每个用户有多个类别,那么我建议使用user_id
和category_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