我如何限制某人访问他未创建的数据? (ruby)
How can I restrict someone to access the data he hasn't created? (ruby)
我正在 rails 上使用 Ruby 和设计。
我生成了一个脚手架。
tasks_controller.rb:
def index
@tasks= current_user.tasks
end
通过使用它,我可以只向人们展示他们创造的东西,
但其他用户可以看到他们未输入的任务数据,例如:
GET /tasks/1
GET /tasks/2
尽管 ID 为 1 的任务不是由 current_user
创建的,但用户可以访问它。
尝试:
def show
@task = current_user.tasks.find(params[:id])
# or with error handling
# begin
# @task = current_user.tasks.find(params[:id])
# rescue
# redirect_to [:tasks], flash: { error: 'not authorized' }
# return
# end
end
Pundit gem(https://github.com/elabs/pundit) 负责这些案例。您的代码将如下所示:
class TaskPolicy
attr_reader :user, :task
def initialize(user, task)
@user = user
@task = task
end
def show?
user.tasks.include? task
end
end
以及您控制器的操作:
def show
@task = Task.find(params[:id])
authorize @task
...
end
如果当前用户没有确定任务
,此操作将引发 Pundit::NotAuthorizedError
是的,您可以使用过滤器(例如
class TasksController < ApplicationController
before_filter :user_can_view_task, only: :show
def show
#you do not need to set @task here as it will be set by the filter method
end
private
def user_can_view_task
@task = Task.find(params[:id])
unless @task.user_id == current_user.id
flash[:notice] = "You may only view Tasks you have created."
redirect_to(tasks_path)
end
end
end
每次用户点击显示视图的路线时,它都会在渲染视图之前执行此方法。 (因此"before")
此方法将查找任务并确定 current_user 是否创建了任务(假设用户和任务之间存在关联)。如果用户不是任务创建者,它将把他们重定向回索引视图,并通知他们只能查看自己创建的任务,而不允许他们访问节目。
我正在 rails 上使用 Ruby 和设计。 我生成了一个脚手架。
tasks_controller.rb:
def index
@tasks= current_user.tasks
end
通过使用它,我可以只向人们展示他们创造的东西, 但其他用户可以看到他们未输入的任务数据,例如:
GET /tasks/1
GET /tasks/2
尽管 ID 为 1 的任务不是由 current_user
创建的,但用户可以访问它。
尝试:
def show
@task = current_user.tasks.find(params[:id])
# or with error handling
# begin
# @task = current_user.tasks.find(params[:id])
# rescue
# redirect_to [:tasks], flash: { error: 'not authorized' }
# return
# end
end
Pundit gem(https://github.com/elabs/pundit) 负责这些案例。您的代码将如下所示:
class TaskPolicy
attr_reader :user, :task
def initialize(user, task)
@user = user
@task = task
end
def show?
user.tasks.include? task
end
end
以及您控制器的操作:
def show
@task = Task.find(params[:id])
authorize @task
...
end
如果当前用户没有确定任务
,此操作将引发 Pundit::NotAuthorizedError是的,您可以使用过滤器(例如
class TasksController < ApplicationController
before_filter :user_can_view_task, only: :show
def show
#you do not need to set @task here as it will be set by the filter method
end
private
def user_can_view_task
@task = Task.find(params[:id])
unless @task.user_id == current_user.id
flash[:notice] = "You may only view Tasks you have created."
redirect_to(tasks_path)
end
end
end
每次用户点击显示视图的路线时,它都会在渲染视图之前执行此方法。 (因此"before")
此方法将查找任务并确定 current_user 是否创建了任务(假设用户和任务之间存在关联)。如果用户不是任务创建者,它将把他们重定向回索引视图,并通知他们只能查看自己创建的任务,而不允许他们访问节目。