Intro
如果使用Yii2原生RBAC做好多層權限架構管理,例如video
類下的program
控制器下的create
權限,可以讓你在Menu上看到video
類跟program
控制器選單。
資料結構
3-layer Item Name pattern:
{module}.{controller}.{action}
依照上述例子,一個create
的權限Item Name應為:
video.program.create
那還需要另外兩個權限:video
, video.program
,
以作為如選單上僅判斷video
大類以及video.program
選單。
video
, video.program
,video.program.create
三個繼承關係的權限items,並不適合使用Yii2 RBAC中的auth_item_child
關係(如透過addChild()
建構),因為video
不能為最高父層,本身擁有video
僅代表至少擁有一個子層,然後auth_item_child
架構上有video
代表擁有全部子層權限。
所以一個action的權限勢必連帶擁有其父層權限,例如擁有video.program.create
items則必須連帶擁有父層:
video.program.create
video.program
video
在管理介面應用上,在下層有選取任一action時往父層繼承(例如選一個action,其controller自動加入權限,再其module自動加入權限)
Group結構實現
上述這種需要多層商業邏輯權限,可以使用auth_item
中的data
欄位做自定義,架構出type及階層關係,在管理介面時就可以透過getItems()
取得全部權限items在逐一依照Data做分類資料建構,實現分群。
完成後的資料即可顯示出每個Group下擁有哪些Controllers再以下擁有哪些actions。
在Menu顯示與否的應用上,大分類透過can('video')
驗證,再往下如選單透過can('video.program')
驗證,action一般控制項在頁面上,就可以再透過can('video.program.create')
控制新增按鈕。