在所有关联的控制器中使用Devise的current_user

时间:2015-04-30 21:20:10

标签: ruby-on-rails devise

我对良好做法有疑问。我即将实施(刚开始)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

我将有更多与用户(或许多用户)相关联的关联。以上是确保用户只能查看允许的项目的好方法吗?因此不需要授权“宝石”吗?

提前致谢 鲁迪

2 个答案:

答案 0 :(得分:1)

简短的回答:是的,你在Devise的current_user做的事情很好。至于授权宝石,您可能需要也可能不需要宝石。

答案越久:

首先要简要说明身份验证和授权之间的区别。

身份验证是关于“这个用户说他们是谁?”。如果我使用用户名'bob'登录,并且能够正确输入bob的密码,那么你的应用程序(通过设计的帮助)可以说“好的,是的,我相信这个用户就是他们说他们是 - 我相信它实际上是键盘末尾的鲍勃“。也就是说,Bob是经过身份验证的

授权是关于“是否允许此用户执行他们正在尝试执行的操作”。例如,Bob可能能够创建新项目,但可能不允许他删除项目。也就是说,Bob 授权来创建项目,并且授权不删除它们。

行。现在,身份验证允许您自己执行某种级别的授权,因为您可以说“已登录的用户可以查看项目,但已注销用户不能“。或者你可能想说,就像你一样,“登录用户可以查看他们自己的项目(但没有人可以),但是注销用户无法查看任何项目”

最后一个场景被登录用户称为“范围”,你使用Devise的current_user的方式就好了。

最后一个问题是,除了Devise提供的授权之外,还需要身份验证 gem。如果您只需要区分登录用户和未登录的用户,那么Devise应该是您所需要的,并且不需要身份验证gem。

另一方面,如果您需要更细粒度的身份验证(例如,同时也是管理员的登录用户可以删除自己的项目,但登录的非管理员用户只能查看自己的项目,并且不能删除它们,那么除了Devise之外,你可能还需要一个授权gem。

答案 1 :(得分:0)

是。如果您不需要任何高级控制功能(如只读),则可以。