簡體   English   中英

Pundit:授權命名空間控制器內的操作

[英]Pundit: authorize actions within namespaced controllers

我有一個具有不同狀態的Blog模型。 為了保持一個瘦控制器並遵循每個控制器僅具有 CRUD 操作的約定,我遵循了DHH 的命名空間控制器模式並將Blog控制器命名空間。

現在我有一個Blogs::NewDraft控制器、一個Blogs::AwaitingApproval控制器和一個Blogs::Active控制器。

問題在於編寫我的策略來授權這些命名空間控制器中的操作。 所有命名空間控制器中的所有操作都授權同一個Blog模型對象。 問題是我需要每個命名空間控制器在匹配的命名空間策略中進行授權(而不是所有命名空間控制器在同一個blog_policy.rb文件中授權。)

基本示例:對於帶有未命名空間的寧靜控制器的寧靜資源,您可以這樣做:

#app/controllers/blogs_controller.rb
class BlogsController < ApplicationController
  def index
    authorize :blog
    @blogs = Blog.all
  end

  def show
    @blog = Blog.find(1)
    authorize @blog
  end
end

現在匹配政策

#app/policies/blogs_policy.rb
class BlogPolicy < ApplicationPolicy
  def index?
    user.admin?
  end

  def show?
    record.author == current_user
  end
end

當你沒有命名空間時,你會這樣做。


嘗試讓 Namespacing 與 Pundit 一起工作的當前代碼:我正在使用命名空間。 我仍在授權一個Blog對象,但我需要在命名空間策略中授權每個命名空間控制器內的操作:

#app/controllers/blogs/new_drafts.rb
class Blogs::NewDraftsController < ApplicationController
  def index
    # doesn't work
    authorize Blog::NewDrafts
    @blogs = Blog.new_drafts
  end
  def show
    @blog = Blog.find(1)
    #doesn't work either
    authorize @blog, Blog::NewDraft
  end
end

所以我希望命名空間控制器不路由到app/policies/blog_policy.rb ,而是路由到app/policies/blogs/new_draft_policy.rb

#app/policies/blogs/new_draft_policy.rb
class Blogs::NewDraftPolicy < ApplicationPolicy
  def index?
    user.admin?
  end

  def show?
    # the record is a blog from the Blog Model
    record.author == current_user
  end
end

Pundit 文檔和使用

不知道如何路由到命名空間策略並傳入Blog記錄。 但是:以下是當您的命名空間策略只能根據當前用戶的權限/角色進行授權時的操作方法:

#app/controllers/blogs/new_drafts.rb
class Blogs::NewDraftsController < ApplicationController
  def index
    authorize [:blogs, :new_draft]
    @blogs = Blog.new_drafts
  end
end

#app/policies/blogs/new_draft_policy.rb
class Blogs::NewDraftPolicy < ApplicationPolicy
  def index?
    user.admin?
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM