雙層權限結構


#1

想請問一下 雙層的權限結構作法

一般單層的權限結構就是

devise + cancancan + rolify

然後由admin來新增 role 或是寫入對應權限 假如達到條件自動判斷

但是雙層的結構該如何撰寫

例如說  admin  新增 4種系種分類的人

    management  管理

    vip customer  VIP顧客

    Monthly fee customers   月費顧客

    general customer  一般顧客

然後 每一個分類的人 可以各自去制定各自的權限

例如

VIP 自己去新增各種類型 自己去配置權限

差不多 等於第一層ADMIN只是定義出有某幾個類型的角色 以及可以作用的範圍

而各個角色可以各自去定義他們範圍內的權限

感覺要變成雙層的結構 或是要用別的權限設計的GEM來做

有沒有相關建議可以了解一下…


#2

devise 和此事無關,略過,current_user 是一個 method 會回傳已經登入的使用者的 User obj 罷了

cancancan 你用心看的話,就可以做到全部的事情了,你加了 rolify 根本就多餘的唄 … 不過 cancancan 不好懂,要參透才行 … 首先強烈建議第一段要加:複寫預設規則,這樣才看得懂後面的 …

#加這段在 application_controller.rb 或是 dashboard_controller.rb 或是 manager_controller.rb
def current_ability
  @current_ability ||= AbilityUser.new(current_user)
end
#也就是目前或繼承的 controller 要用怎樣的規則,而傳入要被分析的對象是誰

#[[%RAILS_PROJECT%/app/models/ability_user.rb]] 我是規則表
class AbilityUser
  include CanCan::Ability
  def initialize(current_user) #這邊從上面那邊傳來的,你要啥 user 甚至物件 session 都行
    #你要做啥都可以在這判斷 ...,類似
    if current_user.is_vip
      can [:index , :show] , [VipItem] #左邊是 action 右邊是 model
      can [:index , :show] , [Item] #你可以多行的持續列下去...
    elsif current_user.is_admin #單純示範用 ... 請用另外一個 model ... 而不是和 user 混雜
      can :manage, :all #全數通過
    else
      #我是隨機權限 ... [a,b,c].sample = 從 array 隨便取一個出來 ... 單純 DEMO 可能性
      can [[:index , :show , :edit , :update , :destroy].sample] , [[VipItem , Item].sample]
    end
    # 你可以額外拆解,從另外的 table 內取出規則,你想做啥都可以,有套用規則表且有列上去的"才可以做"
    # 所以基本上會變成白名單模式就是,所以你要做在後台讓人打勾都行,甚至建立授權樹
  end
end

class VipItemController < ApplicationController
  authorize_resource :class => "VipItem"
  #這行的意思是:我要用 cancancan 的規則,且定義對象為 VipItem 這個 model
  #因為你建好了 current_ability 所以預設會用 AbilityUser 這個過濾式
  #如果沒這行,就代表這 controller 不會進行過濾 ...

  #下面的 action name 會是過濾依據
  def index
    #VIP / manager 會 pass
  end
  def edit
    #manager 會 pass
  end
  def destroy
    #manager 或隨機抽中的才會 pass
  end
end

所以,我從頭順一次 … cancancan 載入後,ApplicationController 預設過濾白名單會採用 current_ability,預設是 AbilityUser 這個 class,但你按照上面的寫法你就可以在不同的 controller 建立不同的過濾規則,類似『一般使用者群』或『管理者群』(下面還有細分)然後把要套用的使用者 / 對象傳入過濾規則內

指定好 controller 要使用的規則表後,規則表很多方式可以寫,最簡單的如同我寫的:[actions動作] , [targets對象(這邊用的是 model )],建議使用白名單過濾就好

之後在實際發生的 controller 上面宣告,這個 controller 套用的是哪個過濾基準(就是上面的 target)即為所求 … anyway 從頭想一次規則,應該會很清晰才是,有問題再提出哩


#3

昨天試了一下

恩… 還沒弄出一個東西

大概可以理解就是繼承的概念

然後再利用細項在繼承一次

還需要一些時間研究一下

有眉目了 但是感覺還有細節需要請問

謝謝jc大說明

先讓我嘗試看看 :kissing: