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’)控制新增按鈕。