使用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