1、由於ABP的IdentityServer的id都是Guid類型的,所以如果你的數據的Id是int類型,將很困難,本人目前暫時未找到解決的辦法。
2、自定義登錄,需要在AuthServer.Host/Pages/Account下添加自定義的Login.cshtml和CustomLoginModel.cs(繼承自LoginModel),Login.cshtml則可以直接拷貝源碼的代碼進行修改。CustomLoginModel.cs重寫OnPostAsync(string action)方法。
3、自定義類的注入
在AuthServerHostModule中注入:
public class AuthServerHostModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) { //自定義登錄及倉儲 PreConfigure<IdentityBuilder>(identityBuilder => { //自定義用戶存取器 identityBuilder.AddUserStore<UserStore>(); //自定義用戶管理器 identityBuilder.AddUserManager<UserManager>(); ////自定義用戶驗證器 //identityBuilder.AddUserValidator<UserValidator>(); //自定義角色管理器 identityBuilder.AddRoleStore<RoleStore>(); //自定義權限管理器 identityBuilder.AddClaimsPrincipalFactory<UserClaimsPrincipalFactory>(); //自定義登錄管理器 identityBuilder.AddSignInManager<SignInManager>(); }); } public override void ConfigureServices(ServiceConfigurationContext context) { var configuration = context.Services.GetConfiguration(); context.Services.AddAbpDbContext<AuthServerDbContext>(options => { options.AddDefaultRepositories(); }); //自定義權限檢查器 Configure<AbpPermissionOptions>(options => { options.ValueProviders.Clear(); options.ValueProviders.Add<UserPermissionValueProvider>(); options.ValueProviders.Add<RolePermissionValueProvider>(); options.ValueProviders.Add<ClientPermissionValueProvider>(); }); //……其他代碼 其他的可以在類屬性注入: [Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
4、用戶、權限、角色的驗證自定義擴展:
ClientPermissionValueProvider//檢查Client的身份 EfCorePermissionGrantRepository//權限是否授予某人的倉儲? PermissionChecker//權限檢查器 PermissionDefinitionProvider//預定義的權限提供器 PermissionStore//權限存儲器 RolePermissionValueProvider//角色檢查器 RoleStore//角色存儲器 SignInManager//自定義登錄管理器 UserClaimsPrincipalFactory//自定義Claim工廠(在這里添加自定義的Clain) UserManager//用戶管理器 UserPermissionValueProvider//檢查用戶的身份 UserRepository//用戶的倉儲(數據庫) UserStore//用戶的存儲(可能讀取緩存) UserValidator//用戶檢驗
以上類加入 [Dependency(ServiceLifetime.Transient, ReplaceServices = true)]
5、在Abp的MsDemo_Identity數據庫中加入RoleIdMap和UserIdMap用戶新舊數據庫用戶和角色Id的映射,新Id類型是Guid,舊Id字段類型視同舊類型。在各種需要使用到用戶、角色的地方,都先從舊數據庫查數據,再根據新舊Id的映射查找新的數據,然后將新舊數據整合賦值返回所需數據。如果查找不到新舊Id的映射,說明這個用戶在新數據庫中不存在,要建立這個用戶和映射的記錄到新數據庫中。這一點是最關鍵的。
6、繼承並重寫PermissionDefinitionProvider類,在這個類中從數據庫讀所有權限並添加到context中
繼承並重寫PermissionStore類,在這個類的“SetCacheItemsAsync”(設置緩存)方法中從數據庫讀特定用戶的權限並緩存、驗證權限等。
每個應用或服務都有自定的權限,這些權限定義在各自的Contracts層里,繼承並重寫PermissionDefinitionProvider類,權限中心會在 PermissionDefinitionManager.GetPermissions()中自動讀取各個應用或服務定義的所有的權限,並在PermissionStore的SetCacheItemsAsync方法(設置緩存)中設置每個用戶的可用權限的緩存,可以在此嵌入自定讀取數據庫數據。
官方文檔:https://docs.abp.io/en/abp/latest/Tutorials/Part-5?UI=MVC&DB=EF
7、數據庫中AbpPermissionGrants表是記錄授予用戶的權限,其中PrividerName是權限的類型,“R”代表是針對角色的授權,“C”代表是針對Client的授權,“U”代表的是針對 用戶的授權。PrividerKey則是角色或Client或用戶的ID
8、開發指引:
https://www.cnblogs.com/nirvanan/articles/14711751.html
https://www.cnblogs.com/nirvanan/articles/14711769.html
9、實踐證明在某一應用中也可以使用另一個應用添加的權限名稱,只要有給該用戶或角色授權即可。