[英]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
不知道如何路由到命名空間策略並傳入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.