abp vnext 通过Claim扩展用户表字段
需求:abp框架原有的abpusers表字段无法满足业务需求,需要新增字段来解决。
实现步骤如下
一.向abpusres表添加字段
1、在domain程序集下新建AppUser表
该类用来定义新增的字段,不需要继承任何父类,如下所示:
public class AppUser{/// <summary>/// 会员Code/// </summary>[MaxLength(50)]public string MemberCode { get; set; }}
2.在EntityFrameworkCore程序集添加MyAppEfCoreEntityExtensionMappings类,
类名可以随意,但是按照惯例,一般以“项目名”+EfCoreEntityExtensionMappings命名。该类主要用来配置为IdentityUser新增字段,代码如下:
public class DemoEfCoreEntityExtensionMappings{private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();public static void Configure(){OneTimeRunner.Run(() =>{ObjectExtensionManager.Instance.MapEfCoreProperty<IdentityUser, string>(nameof(AppUser.MemberCode), b => { b.HasMaxLength(50); });});}}
3.在DemoEntityFrameworkCore程序集下的DemoEntityFrameworkCoreModule模块中配置PreConfigureServices
public override void PreConfigureServices(ServiceConfigurationContext context){DemoEfCoreEntityExtensionMappings.Configure();base.PreConfigureServices(context);}
4.在Admin.HttpApi.Host程序集配置AdminHttpApiHostMigrationsDbContextFactory类中的CreateDbContext
同上一步,在DbContextFactory中进行同样配置,一些情况下我们需要通过DbContextFactory来获取DbContext,如不配置此项,将会导致获取的DbContext中内容不一致。
public DemoDbContext CreateDbContext(string[] args){var configuration = BuildConfiguration();var builder = new DbContextOptionsBuilder<DemoDbContext>().UseMySql(configuration.GetConnectionString("Default"), MySqlServerVersion.LatestSupportedServerVersion,option => { option.MigrationsAssembly("Demo.Admin.HttpApi.Host"); });//添加扩展配置DemoEfCoreEntityExtensionMappings.Configure();return new DemoDbContext(builder.Options);}
5.在Application.Contracts层配置用户表相关Dto的扩展字段
public static class DemoDtoExtensions
{private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();public static void Configure(){OneTimeRunner.Run(() =>{ObjectExtensionManager.Instance.AddOrUpdateProperty<string>(new[]{typeof(IdentityUserDto),typeof(IdentityUserCreateDto),typeof(IdentityUserUpdateDto),typeof(ProfileDto),typeof(UpdateProfileDto)},"MemberCode");});}
}
6、在模块类ApplicationContractsModule中进行配置
为了是上一步配置生效,还需要在MyAppApplicationContractsModule中进行如下配置:
public override void PreConfigureServices(ServiceConfigurationContext context){DemoDtoExtensions.Configure();base.PreConfigureServices(context);}
7、通过EF Core将MemberCode字段添加到abpUsers表中
1)生成迁移脚本
add-migration add_abpUusers_MemberCode
2) 将迁移脚本sql更新到数据库
update-database
二.向CurrentUser会话中Claim赋值
1.在Admin.HttpApi程序集下LoginController类中给toekn中Claim添加自定义字段
/// <summary>/// 在CurrentUser对象的Claims中添加扩展字段/// </summary>private List<Claim> SetUserClaims(IdentityUser userInfo){List<Claim> claims = new List<Claim>();if (userInfo.ExtraProperties.ContainsKey("MemberCode")){//添加会员Codeclaims.Add(new Claim(MemberCode,userInfo.ExtraProperties["MemberCode"].ToString()));}return claims;}//在abp框架生成的方法中添加private async Task<string> GetToken(IdentityUser user, string[] roles){var claims = await CreateJwtClaims(user, roles);//添加自定义claimList<Claim> customClaims = SetUserClaims(userInfo);if (!customClaims.IsNullOrEmpty()){claims.AddRange(customClaims);}//...}
2.在程序集中使用
//获取abpuser表中扩展字段MemberCode值var storeCode = CurrentUser.FindClaimValue("MemberCode");
三、前端账号管理添加扩展字段
1.账号管理列表
//修改vben-admin\src\views\identity\user\datas\TableData.ts列表参数配置
{title: '会员Code',dataIndex: 'extraProperties.MemberCode',align: 'left',width: 270,sorter: true,slots: { customRender: 'MemberCode' }, //通过自定义插槽在列表中显示},
//(修改vben-admin\src\views\identity\user\components\UserTable.vue列表参数配置)
<BasicTable @register="registerTable"><template #MemberCode="{ record }">{{ record.extraProperties.MemberCode}}</template></BasicTable>
2.修改列表添加扩展字段
//修改vben-admin\src\views\identity\user\datas\ModalData.ts配置{tab: t('AbpIdentity.UserInformations'),field: 'memberCode',component: 'Input',label: '会员Code',colProps: { span: 24 },},
//在弹框打开事件里,通过useForm回调函数setFieldsValue设置会员code值const [registerModal, { closeModal }] = useModalInner(async (val) => {const formEl = unref(formElRef);formEl?.setFieldsValue({memberCode: val.extraProperties.MemberCode,});});//保存时需要将会员Code值按后台api接口存在handleSubmit() {const formEl = unref(this.formElRef);const param = formEl?.getFieldsValue();if (param) {param.extraProperties = { MemberCode: param.MemberCode};}formEl?.validate().then(() => {this.handleSaveUser(param).then(() => {this.$emit('change');this.closeModal();});});},
注:表单组件对JSON数据格式读取只能读取一层,像val.extraProperties.MemberCode是读取不到的,需要转换一下。
保存的时候格式又要转回去,必须和接口数据保持一致才行
abp vnext 通过Claim扩展用户表字段相关推荐
- Django解决扩展用户表时,后台Admin显示密码为明文的问题
小生博客:http://xsboke.blog.51cto.com -------谢谢您的参考,如有疑问,欢迎交流 Django解决当扩展用户表时,用户继承AbstractUser后,后台Admin会 ...
- ABP vNext 的实体与服务扩展技巧分享
使用 ABP vNext 有一个月左右啦,这中间最大的一个收获是:ABP vNext 的开发效率真的是非常好,只要你愿意取遵循它模块化.DDD 的设计思想.因为官方默认实现了身份.审计.权限.定时任务 ...
- QPW 系统管理后台用户表(tm_user_info)
文章目录 系统管理后台用户表 字段说明 系统管理后台用户表 CREATE TABLE `tm_user_info` (`user_id` int(11) NOT NULL AUTO_INCREMENT ...
- Abp VNext 集成sharding-core 分表分库
ShardingCore 易用.简单.高性能.普适性,是一款扩展针对efcore生态下的分表分库的扩展解决方案,支持efcore2+的所有版本,支持efcore2+的所有数据库.支持自定义路由.动态路 ...
- 初识ABP vNext(5):ABP扩展实体
点击上方蓝字"小黑在哪里"关注我吧 扩展实体 路由整理 前言 上一篇实现了前端vue部分的用户登录和菜单权限控制,但是有一些问题需要解决,比如用户头像.用户介绍字段目前还没有,下面 ...
- abp Vnext OpenIddect 扩展微信小程序授权登录
abp vnext6.0之后官方替换了原来的ids4,采用了openIddict的oauth认证框架.使用之前的方法已经不行,以下是OpenIddect 使用ITokenExtensionGrant接 ...
- 初识ABP vNext(4):vue用户登录菜单权限
点击上方蓝字"小黑在哪里"关注我吧 登录 菜单权限 运行测试 前言 上一篇已经创建好了前后端项目,本篇开始编码部分. 开始 几乎所有的系统都绕不开登录功能,那么就从登录开始,完成用 ...
- mybatis 动态字段与表中不一样_mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题...
创建用户: /** * 创建一个或多个新用户 insert 字段和表名不确定时动态添加 */ @Test public void createAccount() { String lineColumn ...
- mysql字段作用_mysql用户表host字段作用
mysql用户表中host字段介绍,如果host设置不正确,可能导致无法连接mysql数据库. user_name@host_name,其中host_name是主机IP地址或主机名. 1)为了能够在本 ...
最新文章
- ajax技术如何实现,ajax技术的基本原来以及实现过程
- Python基本语法_基本数据类型_序列类型详解
- LNMP环境搭建(centos6.9+mysql5.7+php7.1+nginx1.10)
- spring中的ReflectionUtil
- java8 lambda 接口_Java8新特性之一:Lambda表达式
- sql注入问题-视图-事物-以及存储过程(可视化工具)
- 如何处理SAP OData错误消息: Invalid parametertype used at function XXXX
- vcenter 6.7 (vcsa)部署指南
- 编程语言对比 基本数据类型
- win11的drivers文件可以删除吗 windows11drivers文件是否可以删除的详细介绍
- 使用python命令行参数sys.argv 做bat脚本
- TabBars代码解读之——Visual Studio的自动化接口
- 视差图Disparity与深度图Depth Map的一点知识
- php 制作通讯录,PHP 制作通讯录(五)
- 数电——全减器分析(用74HC138设计提示)
- 氪金玩家逸仙电商的高端困境
- 有些歌,放在这慢慢听
- Swift All-In-One安装指南
- NP完全问题的归约-碰撞集(HITTING SET)
- CAD .NET 14.1.X DWG/ DXF, PLT 自由转换- CNC
热门文章
- 上汽荣威E50 颇有想法的纯电动产品
- RK 7.1 导航栏添加隐藏虚拟按键的开关 并向上滑动显示虚拟按键
- 识别IOS和android方法
- ,英式发音和美式发音有什么区别
- h5策划书_DIYH5|3.12世界睡眠日H5策划方案
- 计算机读不到u盘如何修复u盘,u盘读不出来怎么办?各种U盘无法显示无法读取修复方案...
- 这几个宝藏网站,一旦知道,你就离不开了!!!
- 梦幻模拟战 服务器维护,《梦幻模拟战》问题修复公告暨致歉信
- Qt编写自定义控件:带阴影、圆角、可拉伸的弹窗
- 动态html函数的写法,如何将html div id的动态传递给js函数