我对良好做法有疑问。我即将实施(刚开始)Pundit以获得我的授权。但是,在我的控制器中,比如项目和阶段我使用current_user关联所有调用。例如
class ProjectsController < ApplicationController
before_action :authenticate_user!
before_action :set_project, only: [:show, :edit, :update, :destroy]
# GET /projects
# GET /projects.json
def index
@projects = current_user.Projects.all
authorize @projects
end
# GET /projects/1
# GET /projects/1.json
def show
end
# GET /projects/1/edit
def edit
end
private
# Use callbacks to share common setup or constraints between actions.
def set_project
@project = current_user.projects.find(params[:id])
authorize @project
end
# Never trust parameters from the scary internet, only allow the white list through.
def project_params
params[:title, :description]
end
end
我将有更多与用户(或许多用户)相关联的关联。以上是确保用户只能查看允许的项目的好方法吗?因此不需要授权“宝石”吗?
提前致谢 鲁迪
答案 0 :(得分:1)
简短的回答:是的,你在Devise的current_user
做的事情很好。至于授权宝石,您可能需要也可能不需要宝石。
答案越久:
首先要简要说明身份验证和授权之间的区别。
身份验证是关于“这个用户说他们是谁?”。如果我使用用户名'bob'登录,并且能够正确输入bob的密码,那么你的应用程序(通过设计的帮助)可以说“好的,是的,我相信这个用户就是他们说他们是 - 我相信它实际上是键盘末尾的鲍勃“。也就是说,Bob是经过身份验证的。
授权是关于“是否允许此用户执行他们正在尝试执行的操作”。例如,Bob可能能够创建新项目,但可能不允许他删除项目。也就是说,Bob 授权来创建项目,并且授权不删除它们。
行。现在,身份验证允许您自己执行某种级别的授权,因为您可以说“已登录的用户可以查看项目,但已注销用户不能“。或者你可能想说,就像你一样,“登录用户可以查看他们自己的项目(但没有人可以),但是注销用户无法查看任何项目”。
最后一个场景被登录用户称为“范围”,你使用Devise的current_user
的方式就好了。
最后一个问题是,除了Devise提供的授权之外,还需要身份验证 gem。如果您只需要区分登录用户和未登录的用户,那么Devise应该是您所需要的,并且不需要身份验证gem。
另一方面,如果您需要更细粒度的身份验证(例如,同时也是管理员的登录用户可以删除自己的项目,但登录的非管理员用户只能查看自己的项目,并且不能删除它们,那么除了Devise之外,你可能还需要一个授权gem。
答案 1 :(得分:0)
是。如果您不需要任何高级控制功能(如只读),则可以。