iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Software Development

Rails 開發,每日一套件介紹! 系列 第 12

Day 12 : 很抱歉,您的權限不足以閱讀這篇文章 - Pundit (上)

  • 分享至 

  • xImage
  •  

Hello, 我是 Weber,一位工程師,斜槓鼓手與行銷顧問。
Rails 開發,每日一套件第 12 天,跟我一起認識 Rails 開發好用的 30 個套件,建立出自己的常用套件庫吧!

Day 12: Pundit

開門見山的說,Pundit 是一款權限管理的實用套件。什麼是權限管理呢?
以會員為例,你可以在會員間設計不同的權限,哪些功能是A可以用,而B不能用,符合A或B的設定是什麼?

要注意的是,會員系統跟會員權限是不一樣的東西。我自己一開始在學習的時候,在這一塊有一點搞混。

  • 會員系統通常只管理到 註冊、登入/登出(發session)、會員驗證等。
  • 會員權限則是更進一步,好比可以定義出 Admin、Manager、Member等,依你的需求設定,並賦予不同權限能執行不同的功能。常見的白金會員、一般會員等,也可以用這個套件完成。

安裝方式:

一樣的,先 bundle add 安裝

bundle add pundit

接著在 ApplicationController 裡寫入 include Pundit::Authorization

class ApplicationController < ActionController::Base
  include Pundit::Authorization
end

完成後,在終端中輸入:

rails g pundit:install

會在你的專案內app底下產生一個 policies 的資料夾,並且在內部會有一個application_policy.rb的文件。內容如下:

# frozen_string_literal: true

class ApplicationPolicy
  attr_reader :user, :record

  def initialize(user, record)
    @user = user
    @record = record
  end

  def index?
    false
  end

  def show?
    false
  end

  def create?
    false
  end

  def new?
    create?
  end

  def update?
    false
  end

  def edit?
    update?
  end

  def destroy?
    false
  end

  class Scope
    def initialize(user, scope)
      @user = user
      @scope = scope
    end

    def resolve
      raise NotImplementedError, "You must define #resolve in #{self.class}"
    end

    private

    attr_reader :user, :scope
  end
end

這個 application_policy.rb 一開始看起來,有點複雜,需要一點解釋來理解。
使用官方文件的例子來舉例好了!

class PostPolicy
  attr_reader :user, :post

  def initialize(user, post)
    @user = user
    @post = post
  end

  def update?
    user.admin? || !post.published?
  end
end

首先,class 是 PostPolicy,所以可以假設這是一個與 Post Model 具有相同的名稱的 Policy。
第一個參數是使用者。在 Controller 中,Pundit 會呼叫 current_user 的方法來抓取要傳送到此參數的內容。
第二個參數可以是某種 Model 對象,要檢查其授權。不需要是 ActiveRecord 或 ActiveModel,它可以是任何東西。

到這裡應該還可以理解,不過真正麻煩的其實從這裡才開始!這個套件有很多小小細節要注意。
我認為有必要將這個套件分為 上/下集 來寫,今天先介紹到這裡,我們改日再補完下集!

我們明天見!


上一篇
Day 11: - 黑暗且神祕的圖片加工領域 - ImageProcessing
下一篇
Day 13: 開開心心寫測試 - RSpec & RSpec - rails
系列文
Rails 開發,每日一套件介紹! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言