問題
預設 ABP 的權限會定義在繼承自PermissionDefinitionProvider的類別中,
當系統跑起來時,會自動將它們加到 Memory 之中,並存到AbpPermissionGroups及AbpPermissions資料表之中。
但是,如果要動態地去新增權限,要怎麼做呢?
解法
預設如果在AbpPermissions 資料表中的資料,卻沒定義在程式中,就不會被 Load 到 Memory 之中。
如果共用權限系統,那麼會變成需要將那些程式都各自加到各別系統中,而且只要有調整,就需要重新編譯程式!!!
所以,ABP Support dynamic permissions, 只要將設定PermissionManagementOptions的IsDynamicPermissionStoreEnabled屬性為true。
這樣就會連同資料庫中的 Permissions 資料一併加到 Memory 之中。
所以要如何動態新增權限呢?
可以參考ABP DynamicPermission Sample的方式,
透過IPermissionGroupDefinitionRecordRepository及IPermissionDefinitionRecordRepository將權限加到資料庫,
再將 Cache 設定為過期,這樣就可以新增權限後,該權限就會在 Memory Cache 之中。
1.透過 ABP 建立 BookStore Web 系統
2.加入FixedLocalizableStringSerializer避免沒設定多國語系而發生錯誤,
1 | [] |
3.設定IsDynamicPermissionStoreEnabled為true
在BookStoreModule.cs中ConfigureServices最後加入設定,
1 | Configure<PermissionManagementOptions>(options => |
4.建立PermissionDefinitionAppService.cs來負責新增權限,
權限資料可以加入額外的一些屬性,例如 Url, Icon, Target ,可用在 Menu
1 | public class PermissionDefinitionAppService : BookStoreAppService |
5.在 Page 中讓使用者設定權限資料,並呼叫PermissionDefinitionAppService來新增權限
Index.cshtml.cs
1 | public class IndexModel : AbpPageModel |
Index.cshtml.cs
1 | <div class="row"> |
6.在 BookStoreMenuContributor.cs 中,動態來依使用者的權限新增 Menu,
1 | public class BookStoreMenuContributor : IMenuContributor |
使用 admin 登入後,動態加入權限
在設定權限功能,可以看到上一步新增的權限,已經可以看到並設定,
重整畫面,就可以依權限來呈現 Menu。
參考資源
How to Dynamic Add/Update Permissions and Refresh Cache in ABP
ABP DynamicPermission Sample
Generate Permission Automatically from external service