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

Use Devise's current_user in all associated controllers

我有一个关于良好做法的问题。我即将实施(刚刚开始)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

我将拥有更多与一个用户(或许多用户)关联的关联。以上是确保用户只能查看允许他们查看的项目的好方法吗?是否不需要授权 'gem'?

提前致谢 鲁迪

是的。如果您不需要任何高级控制功能(如只读)也没关系。

简短的回答:是的,你用 Devise 的 current_user 做的很好。至于授权 gem,您可能仍然需要也可能不需要。

较长的答案:

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

认证就是说"is this user who they say they are?"。如果我使用用户名 'bob' 登录,并且能够正确输入 bob 的密码,那么您的应用程序(通过设计的帮助)能够说 "OK, yep, I believe this user is who they say they are - I believe that it is in fact Bob on the end of the keyboard".也就是说,Bob 已通过身份验证

授权就是说"is this user allowed to do what they are trying to do"。例如,Bob 可以创建新项目,但可能不允许他删除项目。也就是说,Bob有授权创建项目,没有授权删除项目。

好的。现在,authentication 本身允许您执行某种级别的 authorisation,因为您可以说 "logged in users can view projects, but logged out users can't"。或者你可能想像现在这样说,"logged in users can view their own projects (but no one elses), but logged out users can't view any projects".

登录用户将最后一个场景称为 "scoping",您的操作方式(使用 Devise 的 current_user)就很好。

最后一个问题是除了授权之外,您是否需要身份验证gem由设计提供。如果您需要做的只是区分已登录 用户和未登录 用户,那么 Devise 应该就是您所需要的,而且没有需要身份验证 gem.

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