以實際資料表的資料、前端畫面與 Chrome F12 Network XHR
來看 ABP 的權限管理系統是如何運作的
.Net Core Identity
ABP 授權基於微軟官方 .Net Core Identity,這邊先看一下實體相關訊息
實體類型
此 Identity 模型包含下列實體類型:
- User 代表使用者。
- Role 代表角色。
- UserClaim 表示使用者擁有的宣告。
- UserToken 表示使用者的驗證權杖。
- UserLogin 將使用者與登入產生關聯。
- RoleClaim 代表授與角色內所有使用者的宣告。
- UserRole 關聯使用者和角色的聯結實體。
實體類型關聯性
實體類型會以下列方式彼此相關:
- 每個都 User 可以有許多 UserClaims 。
- 每個都 User 可以有許多 UserLogins 。
- 每個都 User 可以有許多 UserTokens 。
- 每個都 Role 可以有許多相關聯的 RoleClaims 。
- 每個都 User 可以有許多相關聯 Roles ,而且每個都 Role 可以與許多相關聯 Users 。 這是多對多關聯性,需要資料庫中的聯結資料表。 聯結資料表是由 UserRole 實體表示。
ABP 授權
ABP 在 .Net Core Identity 的使用者與角色之外又加了一個授權表,授權相關資料表如下
- [AbpUsers]:使用者
- [AbpRoles]:角色
- [AbpUserRoles]:使用者角色關係
- [AbpPermissionGrants]:權限授予
使用者與角色應該沒有甚麼問題,這邊主要介紹一下 AbpPermissionGrants 這張表
AbpPermissionGrants (權限授予表)
- [Name]:賦予權限名稱
- BookStore.Books:讀取
- BookStore.Books.Create:建立
- BookStore.Books.Edit:更新
- BookStore.Books.Delete:刪除
- [ProviderName]:決定 [ProviderKey] 的種類
- R:Role(角色)
- U:User(使用者)
- (應該還有個C代表Client)
- [ProviderKey]:紀錄實際賦予權限的目標
- [AbpRoles].[Name]:角色名稱
- Admin
- Tester
- [AbpUsers].[Id]:使用者唯一識別碼
- 0bac35fb-50b2-b79c-ca02-39fdf320f3f7
- [AbpRoles].[Name]:角色名稱

從關聯性可以看出使用者與角色中間透過使用者角色建立關係

從資料可以看出全賦予的ProviderKey對應到角色的名稱

而前端如何知道系統有哪些權限,使用者又取得了甚麼權限,則是透過 application-configuration 這支 API 回傳 Auth 的 Policies 與 GrantedPolicies
Auth
- GrantedPolicies
- BookStore.Authors
- BookStore.Authors.Create
- Policies
- BookStore.Authors
- BookStore.Authors.Create
- BookStore.Authors.Edit
- BookStore.Authors.Delete

然後前端可以根據這些權限資料來決定menu與按鈕要不要顯示給使用者操作對應功能
比如:Admin 登入會顯示管理,Tester 登入責管理不會出現在 menu 中
(應該也可以透過 claim 來看)

1.會先建立角色

2.賦予角色權限

3.修改使用者

4.賦予使用者角色

也可以直接給使用者特定權限

直接將權限賦予使用者Id

這邊的U代表使用者,R代表角色,冒號後面則是對應的Key

回資料庫可以看到權限賦予時直接將使用者的Id當作Key存進了權限賦予表中。
參照:
ABP.IO WEB應用程式框架 新手教學 No.06 開發教學 第 5 部分 授權
