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、实践证明在某一应用中也可以使用另一个应用添加的权限名称,只要有给该用户或角色授权即可。