使用ABP VNext微服務器Sample和自定義用戶、角色、權限的實踐(干貨)


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、實踐證明在某一應用中也可以使用另一個應用添加的權限名稱,只要有給該用戶或角色授權即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM