問題
預設 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