重写abp框架UserManager类

news2024/12/23 3:09:47

背景:用过abp框架的应该都知道,abp框架会封装一些成熟的类方法提供给使用者来使用,用来操作 一些内置的实体类(类中一些字段设置为了protected internal),比如IdentityUser、IdentityRole等。但是这些封装的方法总是会有各种各样的校验,当然如果我们没有特殊需求,可以直接使用它提供的方法,本文就是基于创建、更新用户信息时,用户名重复的校验所写,像密码规则的校验,这里预留了参数来操作校验与否。

1.在Domain层创建UserManager
这里我们继承了UserManager的泛型类,这是为了偷个懒,毕竟不是要重写所有的方法,其他的方法我们可继续使用。
创建用户

public virtual async Task<IdentityResult> CreateAsync(IdentityUser user, string password, bool validatePassword = false)
{
    ThrowIfDisposed();
    if (user == null)
    {
        throw new ArgumentNullException(nameof(user));
    }
    if (string.IsNullOrEmpty(password))
    {
        throw new ArgumentNullException(nameof(password));
    }
    var result = await SetPasswordHashAsync(user, password,validatePassword);
    if (!result.Succeeded)
    {
        return result;
    }
    return await CreateAsync(user);
}

public override async Task<IdentityResult> CreateAsync(IdentityUser user)
{
    this.ThrowIfDisposed();
    await SetLockoutEnabledAsync(user, true);
    await UpdateNormalizedUserNameAsync(user);
    await UpdateNormalizedEmailAsync(user);
    return await Store.CreateAsync(user, this.CancellationToken);
}

这里我们写了 两个接口:
第一个:看参数很明显,这个是需要带着密码来创建的,里面校验了一些基本信息,其中validatePassword就是设置是否按照设定的密码规则进行校验。

Configure<IdentityOptions>(options =>
{
    options.User.RequireUniqueEmail = false;
    options.User.AllowedUserNameCharacters = "";
    options.Password.RequireDigit = false;
    options.Password.RequireLowercase = false;
    options.Password.RequireUppercase = false;
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequiredLength = 8;
});
这段代码的配置可以放在api.host的module里,用来配置密码、邮箱、还有用户名格式的限制。
 options.User.AllowedUserNameCharacters = "";特殊说明一下,设置为空后,用户名就可以任意写了,否则abp有个默认的字符集限制,“abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+”,也就是你的用户名只能从这些字符里选,否则校验就会失败。

第二个:这个里面就什么校验都没有了。
更新用户

/// <summary>
/// Updates the specified <paramref name="user" /> in the backing store.
/// </summary>
/// <param name="user">The user to update.</param>
/// <returns>
/// The <see cref="T:System.Threading.Tasks.Task" /> that represents the asynchronous operation, containing the <see cref="T:Microsoft.AspNetCore.Identity.IdentityResult" />
/// of the operation.
/// </returns>
public override async Task<IdentityResult> UpdateAsync(IdentityUser user)
{
    this.ThrowIfDisposed();
    if(user==null)
    {
        throw new ArgumentNullException(nameof (user));
    }
    
    await this.UpdateNormalizedUserNameAsync(user);
    await this.UpdateNormalizedEmailAsync(user);
    return await this.Store.UpdateAsync(user, this.CancellationToken);
}

public async Task<IdentityResult> SetPasswordHashAsync(IdentityUser user,string password, bool validatePassword = false)
{
    return await UpdatePasswordHash(user, password, validatePassword);
}

这里有两个方法:
第一个:更新用户信息。
第二个:更新用户的密码。
这里单独更新密码,也是因为更新用户信息不一定就更新密码,所以预留个接口,需要的时候调用即可。

2.体验效果
写完后我们体验一下使用效果,随便写个service,注入我们写的UserManager:
我写了三个简单的方法:

public async Task<IdentityUser> GetUserByNameAsync(string userName)
{
    var user =await _userManager.FindByNameAsync(userName);
    return user;
}

public async Task<IdentityResult> CreateUserAsync(string userName, string password,string phoneNumber)
{
    var user = new IdentityUser(Guid.NewGuid(), userName,$"{userName}@bookstore.com");
    user.SetPhoneNumber(phoneNumber,true);
    
    return await _userManager.CreateAsync(user, "bookStore12345..");
}

public async Task<IdentityResult> UpdateUserAsync(Guid userId,string userName, string password,string phoneNumber)
{
    var user = await _userManager.FindByIdAsync(userId.ToString());
    user.SetPhoneNumber(phoneNumber,true);
    await _userManager.SetUserNameAsync(user, userName);
    await _userManager.SetPasswordHashAsync(user, password);
    return await _userManager.UpdateAsync(user);
}

调用创建方法:
在这里插入图片描述
完全相同的参数,我们这里调用了两次,都是成功。
在这里插入图片描述
数据库的记录也是有相同用户名的两条。创建没有问题,我们试下更新。

如果相同用户名的有多条,那么调用userManager.FindByNameAsync方法时会报错吗?如果不报错那么会返回哪条记录呢?下面看下调用效果。下面图中的效果是我调用接口10次返回的同样一个结果,都是最早创建的那个用户。
这里创建和修改时的用户名重复校验取消后,我们尽量就不要再去调用FindByNameAsync方法了,虽然它不报错,但是返回的是默认第一个创建的这个用户名的用户。

在这里插入图片描述
调用更新方法:
在这里插入图片描述
在这里插入图片描述
更新需要传入id,这里我们调用了两次,都成功了。看下数据库效果:
在这里插入图片描述
没有什么问题,更新成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1180265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

那些误导消费者的PoE交换机,你知道多少?

PoE交换机是一种具备供电功能的交换机&#xff0c;广泛运用于安保监控和无线覆盖领域&#xff0c;有效避免了对摄像头和无线AP进行繁琐的电源布线。通常来说&#xff0c;对于规模较大的无线覆盖和网络监控项目&#xff0c;大多数人会选择使用支持PoE的交换机。 自PoE供电技术问…

必看!2023年最新MSP开源应用程序指南电子书大揭秘

开源工具有利于节省成本、更好的技术和灵活性已经成为业界的共识。 在理想的世界中&#xff0c;我们用于工作的一切都可以是基于开源的。 但是在生产关键服务的实施和管理中&#xff0c;工程师和业务决策者必须有更好的决策方法来确定哪些工具可以适用于每个需求。 这并不表示…

A. Hit the Lottery

#include<bits/stdc.h> using namespace std; const int N1e55; int n,a[N],res; int main(){scanf("%d",&n);int an/100;n%100;int bn/20;n%20;int cn/10;n%10;int dn/5;n%5;int en;cout<<abcde;return 0; }

APISpace 手机号码归属地API接口案例代码

1.手机号码归属地API产品介绍 APISpace 的 手机号码归属地API&#xff0c;提供全国移动、联通、电信等手机号码归属地查询&#xff0c;上亿条数据囊括最新的170、166、147等号段&#xff0c;更新及时、准确度高。 2.手机号码归属地API详解 2.1 接口请求 请求方式&#xff1a…

知行电子口岸EDI端口介绍

电子口岸或者其他物流企业需要确保能够生成和解析符合交通部要求的EDI数据格式。这可能需要进行一些EDI数据映射工作&#xff0c;以确保数据的正确传输和处理。为了支持此需求&#xff0c;我们的开发人员将这些功能模块集成在电子口岸端口中&#xff0c;这个端口的主要功能是将…

建立TCP连接后发送窗口, 接收窗口, 拥塞窗口的变化情况

参数设置 最大段长MSS1KB, 拥塞窗口初始阈值为32KB, 接收窗口为20KB 变化如下

Unreal UnLua + Lua Protobuf

Unreal UnLua Lua Protobuf https://protobuf.dev/ protobuf wire format&#xff1a;pb 编译到底层的数据协议 https://github.com/starwing/lua-protobuf/blob/master/README.zh.md buffer 处理 lua string 可以当 buffer 用&#xff0c;# len 不会遇到 0 截断&#xf…

【今天放个大招,带你手把手搭建 Jenkins 的分布式构建】

UI 自动化测试代码写完了以后&#xff0c;会放到 Jenkins 这样的持续集成工具上去构建。 如果 Jenkins 平台是搭建在服务器上&#xff0c;会面临 2 个问题&#xff1a; 第一个问题是 UI 自动化测试需要渲染界面&#xff0c;需要消耗大量的 CPU 和内存资源&#xff0c;如果服务器…

埃隆·马斯克的 AI 聊天机器人 Grok 已经上线

昨天&#xff0c;埃隆马斯克 (Elon Musk) 通过他的公司 xAI 推出了一款名为 Grok 的新型人工智能聊天机器人。这款新的聊天机器人将通过 Twitter 更新实时获取世界知识&#xff0c;使其成为最新的对话 AI 系统。 Grok 的独特和基本优势在于它可以通过 &#x1d54f; 平台实时了…

如何在 Vue.js 中引入原子设计?

前言 原子设计是一种创建设计系统的方法&#xff0c;它将用户界面分解为可重用的小组件&#xff0c;即&#xff1a; Atoms 原子Molecules 分子Organisms 生物体Templates 模板Pages 页面 通过遵循模块化设计方法&#xff0c;原子设计可帮助团队创建一致、可缩放且可维护的 …

10-27 maven概念

maven maven的概念模型: 项目对象模型(POM: Project object Model)&#xff0c;一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型&#xff1a; 把项目当成一个对象&#xff0c;描述这个项目&#xff0c;使用p…

[CISCN 2023 初赛]go_session

文章目录 考点代码审计main.goroute.goIndex函数Admin函数Flask函数 解题过程伪造session获取server.py构造payload覆盖server.py命令执行 考点 session伪造&#xff0c;pongo2模板注入&#xff0c;debug模式覆盖源文件 代码审计 main.go package mainimport ("github.c…

解决:ImportError: cannot import name ‘get_config‘

解决&#xff1a;ImportError: cannot import name ‘get_config’ 背景 今天使用Conda构建项目运行环境的时候报错&#xff1a;ImportError: cannot import name ‘get_config’ ##报错问题 from keras.callbacks import LearningRateScheduler, ModelCheckpointFile "D…

计算机毕设 基于大数据的高校校园学生一卡通数据分析

文章目录 0 项目简介任务 1数据导入与预处理任务 1.1 探查数据质量并进行缺失值和异常值处理1.1.2检查重复值1.1.3数据内容总览1.1.4数据分布总览1.1.5消费金额和消费次数观察消费金额和消费次数的散点图1.1.6观察 CardCount 特征的分布情况 任务2 食堂就餐行为分析任务 2.2 食…

1.IntelliJ-IDEA修改CobaltStrike

IntelliJ-IDEA修改CobaltStrike 前期准备一、创建一个新项目二、创建一个lib目录三、重构代码四、运行效果 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均…

奔驰E Coupe 升级鼠标按键 操作简单 完美结合

人机交互系统正是汽车智能化发展的产物&#xff0c;它实现了人与车之间的互联。不知道大家有没有发现&#xff0c;在很多奔驰车的中央扶手箱前&#xff0c;有一块类似于“鼠标”的操作区&#xff0c;它并不是我们常见的换挡杆&#xff0c;而是奔驰研发的独立影音控制系统COMAND…

监控actuator配置以及踩坑记录

以前这个监控都是领导去加&#xff0c;我顶多去修改一些时间参数&#xff0c;让我自己加还是头一次 正经踩了不少坑啊 1.依赖引入 先说配置过程 不对 先说我们项目结构 我们有一个common项目&#xff0c;作为一个公共项目。各种项目公用的依赖&#xff0c;都配置在common中…

Cassandra介绍(二)

1.8. 数据 存储 &#xff08; CommitLog、MemTable、SSTable &#xff09; 写请求分别到 CommitLog 和 MemTable, 并且 MemTable 的数据会刷写到磁盘 SSTable 上. 除 了写数据,还有索引也会保存到磁盘上. 先将数据写到磁盘中的 commitlog&#xff0c;同时追加到中内存中的数据…

物理机安装CentOS7

准备阶段 一个需要安装版本的iso镜像文件一个U盘一台物理机一台有windos系统的电脑 制作启动盘 下载UltraISO &#xff08;收费 搜一搜可以解决&#xff09; 写入硬盘映像 先格式化&#xff0c;选择usb-hdd v2 写入 可能会卡 耐心等待 安装系统 插入u盘 进入 启动项选择页…

python使用selenium做自动化,最新版Chrome与chromedriver不兼容

目前Chrome版本是118.0.5993.118 下方是版本对应的下载地址&#xff1a; chrome版本118&#xff1a; https://download.csdn.net/download/qq_35845339/88510476 chrome版本119&#xff1a; chromedriverlinux64https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testin…