为ABP新增手机验证模块

news2024/11/19 14:34:28

当前手机验证基本是标配,但Abp自身并没有实现这个功能,于是有了通过自定义模块实现的想法。

经过研究,发现要实现这个,只要重写和替换包含ReplaceEmailToUsernameOfInputIfNeeds方法的类就可以了。但要实现这个,首先要在IdentityUserManager类中添加FindByPhoneAsync方法用来通过手机号码查询用户。刚开始想通过扩展方法的方式来实现,但发现唯一能用来获取用户集合的公共属性Users并不能用,而又没有其他办法获取存储,于是放弃该方法。现在只能通过自定义IdentityUserManager来实现了。于是在创建了Generic.Abp.PhoneLogin.Domain模块定义了PhoneLoginUserManager对象。

Abp的源代码中搜索ReplaceEmailToUsernameOfInputIfNeeds,会发现有以下5个类包含该方法:

  • Volo.Abp.Account.Web模块的AccountControllerLoginModel
  • Volo.Abp.Account.Web.IdentityServer模块的IdentityServerSupportedLoginModel
  • Volo.Abp.IdentityServer.Domain模块的AbpResourceOwnerPasswordValidator
  • Volo.Abp.OpenIddict.AspNetCore模块的TokenController

Volo.Abp.Account.Web模块的AccountControllerLoginModel

由于Volo.Abp.Account.Web.IdentityServer模块的IdentityServerSupportedLoginModel调用的是Volo.Abp.Account.Web模块的``LoginModelReplaceEmailToUsernameOfInputIfNeeds`方法,因而可以忽悠这个。

对应各个要重写的模块,建立对应的模块就行了。
对于AccountController,通过替换控制器的方式就可实现替换了,具体代码如下:

    [IgnoreAntiforgeryToken]
    [RemoteService(Name = AccountRemoteServiceConsts.RemoteServiceName)]
    [Controller]
    [ControllerName("Login")]
    [Area("account")]
    [Route("api/account")]
    [Dependency(ReplaceServices = true)]
    [ExposeServices(typeof(AccountController), IncludeSelf = true)]
    public class PhoneLoginAccountController : AccountController
    {
        public PhoneLoginAccountController(
            SignInManager<IdentityUser> signInManager,
            PhoneLoginUserManager userManager,
            ISettingProvider settingProvider,
            IdentitySecurityLogManager identitySecurityLogManager,
            IOptions<IdentityOptions> identityOptions) :
        base(signInManager, userManager, settingProvider, identitySecurityLogManager, identityOptions)
        {
            LocalizationResource = typeof(AccountResource);
            PhoneLoginUserManager = userManager;
        }

        protected PhoneLoginUserManager PhoneLoginUserManager { get; }


        protected override async Task ReplaceEmailToUsernameOfInputIfNeeds(UserLoginInfo login)
        {

            var userByUsername = await UserManager.FindByNameAsync(login.UserNameOrEmailAddress);
            if (userByUsername != null)
            {
                return;
            }

            var userByPhone = await PhoneLoginUserManager.FindByPhoneAsync(login.UserNameOrEmailAddress);
            if (userByPhone != null)
            {
                login.UserNameOrEmailAddress = userByPhone.UserName;
                return;
            }

            if (!ValidationHelper.IsValidEmailAddress(login.UserNameOrEmailAddress))
            {
                return;
            }

            var userByEmail = await UserManager.FindByEmailAsync(login.UserNameOrEmailAddress);
            if (userByEmail != null)
            {
                login.UserNameOrEmailAddress = userByEmail.UserName;
                return;
            }


            return;

        }


    }

ReplaceEmailToUsernameOfInputIfNeeds方法内,主要是通过FindByPhoneAsync方法查找用户,如果找到用户,就用找到的用户名替换登录用户名就行了。

在这里要注意的是使用PhoneLoginUserManager替换原来的IdentityUserManager

对于LoginModel,可以使用只替换LoginModel的方式,这里图方便直接使用了覆盖Login.cshtml的方式。代码就不贴了,大家可以去Github查看源代码。

Volo.Abp.IdentityServer.Domain模块的AbpResourceOwnerPasswordValidator

IdentityServer4是通过IResourceOwnerPasswordValidator接口来实现密码验证的,因而要替换IResourceOwnerPasswordValidator需要点技巧,笔者也是找了一圈才找到的。

具体的ReplaceEmailToUsernameOfInputIfNeeds方法就不贴了,基本上和AccountController没什么不同。

最难部分是在模块定义中替换原有的AbpResourceOwnerPasswordValidator:

    public class GenericAbpPhoneLoginIdentityServerDomainModule : AbpModule
    {
        public override void PreConfigureServices(ServiceConfigurationContext context)
        {
            PreConfigure<IIdentityServerBuilder>(builder =>
            {
                builder.AddResourceOwnerValidator<PhoneLoginResourceOwnerPasswordValidator>();
            });
            context.Services.Replace(
              ServiceDescriptor.Transient<AbpResourceOwnerPasswordValidator, PhoneLoginResourceOwnerPasswordValidator>());
        }
    }

代码需要先把PhoneLoginResourceOwnerPasswordValidator添加到验证器,然后再替换。

Volo.Abp.OpenIddict.AspNetCore模块的TokenController

这个和替换AccountController没什么不同,就不具体说了。

使用方法

OpenIddict

  • 在应用的Domain.Shared模块引用Generic.Abp.PhoneLogin.Domain.Shared
  • 在应用的Domain模块引用Generic.Abp.PhoneLogin.Domain
  • 在应用的Web模块引用Generic.Abp.PhoneLogin.Account.WebGeneric.Abp.PhoneLogin.OpenIddict.AspNetCore

IdenttityServer

  • 在应用的Domain.Shared模块引用Generic.Abp.PhoneLogin.Domain.Shared
  • 在应用的Domain模块引用Generic.Abp.PhoneLogin.DomainGeneric.Abp.PhoneLogin.IdentityServer.Domain
  • 在应用的Web模块引用Generic.Abp.PhoneLogin.Account.Web

具体示例可查看分支测试identtiyServer4手机登录

验证获取令牌
源代码:https://github.com/tianxiaode/GenericAbp

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

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

相关文章

sql server提供三种常用截取字符串方法,LEFT()、RIGHT()、SUBSTRING()

一、sql server提供了三种常用截取字符串方法&#xff0c;LEFT()、RIGHT()、SUBSTRING() 1、LEFT()函数语法&#xff1a;LEFT(character,integer) 注释&#xff1a;参数1&#xff1a;要截取的字符串&#xff0c;参数2&#xff1a;截取字符个数说明&#xff1a;返回从字符串左边…

你的 VS Code 扩展值得信赖吗?

Aqua Nautilus 研究人员最近发现&#xff0c;攻击者可以轻松地冒充流行的 Visual Studio Code 扩展并诱骗不知情的开发人员下载它们。VSCode 是迄今为止最受欢迎的 IDE&#xff1b;StackOverflow 的一项调查指出&#xff0c;其目前已被 74.48% 的开发人员所使用。VSCode 的强大…

SPDK技术浅析

目录SPDK基础知识SPDK架构SPDK使用rpc后台启动基础机制分析后端vhost异步I/O写该篇的来由是因为翻阅到了TriCache: A User-Transparent Block Cache Enabling High-Performance Out-of-Core Processing with In-Memory Programs文章&#xff0c;其中对SPDK的运用的炉火纯青&…

数据结构(1)并查集

(4条消息) 第五课、Trie树、并查集、堆和堆排序_yan__kai_的博客-CSDN博客 活动 - AcWing 并查集作用&#xff1a;一群元素将可以归类到一个代表元素上。可以维护元素到根节点的距离。可以维护每个并查集的大小。 基本操作回顾基础课&#xff0c;特别是“食物链”那道题 目录…

【Django项目开发】部门管理模块的开发(八)

文章目录一、模型类设计二、视图设计1.都有哪些接口三、序列化器类设计四.分页操作1.utils工具中定义pagination.py2.视图类中使用五.路由配置一、模型类设计 一个部门下面可能会有很多子部门&#xff0c;一个子部门上面可能会有父部门&#xff1b;即部门内部之间进行关联&…

国科大模式识别与机器学习2022年期末总结

我根据本学期老师说的考试重点和我自身的情况总结的&#xff0c;希望能帮助到你&#xff0c;如有错误欢迎指正 目录第三章 判别函数Fisher线性判别感知机算法第四章 特征选择和提取K-L变换第五章 统计学习学习基础损失函数风险正则化过拟合欠拟合泛化误差第六章 有监督学习有监…

【jQuery】常用API——jQuery内容文本值

要针对元素的内容还有表单的值操作。 普通元素内容 html()&#xff08;相当于原生 inner HTML) html(); // 获取元素的内容html(内容); // 设置元素的内容<script src"../jquery.min.js"></script> </head><body><div><span>我是…

118页4万字智慧检务大数据平台解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目录 第1章 前言 1.1、 政策背…

docker-compose keep-alive mysql8 互为主从

一、准备2台物理机器master-1、master-2&#xff0c;目标虚拟VIP。   VIP:192.168.1.139   master-1:192.168.1.17   master-2:192.168.1.20    二、然后分别在2台物理机器master-1、master-2上使用docker-compose安装mysql8&#xff0c;并配置互为主从。 1&#xff09…

优先级队列、仿函数和反向迭代器

文章目录优先级队列priority_queue的模拟实现框架无参的构造(默认构造)迭代器区间构造向上调整向下调整插入删除取堆顶的数据求数据个数验满初识仿函数模拟实现仿函数更改后的向上调整仿函数更改后的向下调整反向迭代器具体实现优先级队列 1.优先队列是一种容器适配器&#xf…

微信转账api(企业付款)

企业付款介绍 提供企业向用户付款的功能&#xff0c;支持企业通过API接口付款&#xff0c;或通过微信支付商户平台网页功能操作付款。 1. 充值 登录微信支付商户平台&#xff0c;通过网页充值功能充值&#xff08;商户平台-资金管理-现金管理-充值&#xff09;。 温馨提示&a…

BreederDAO x DigiCult AMA——要点总结

问&#xff1a;为什么 BreederDAO 决定花费 200ETH 用于购买 Mythic DigiDaigaku Genesis — Ifrit&#xff1f; 答&#xff1a;除了投资之外&#xff0c;这也是为了确保这个领域中有更多的可触达性&#xff0c;尤其是随着我们 DigiDaigaku 市场工具的推出之后。这也是我们进入…

(十七)Async异步和多线程-语言进阶1

&#xff08;十七&#xff09;Async异步和多线程-语言进阶1一、进程-线程-多线程&#xff0c;同步和异步1.概念2.同步和异步3.异步与多线程异同点二、委托启动异步调用1.同步方法2.异步方法三、多线程的特点四、异步的回调和状态参数1.顺序控制2.状态参数五、异步等待三种方式1…

开学季,护眼灯什么牌子好?2023年护眼台灯推荐

2023年开始了&#xff0c;时间飞逝&#xff0c;而每个父母都越来越紧张自家娃的学业情况&#xff0c;我国近视人数超过7亿人&#xff0c;而儿童时期是视力发育的关键时期&#xff0c;为啥有那么高的近视率呢&#xff1f;主要是用眼过度&#xff0c;以及用眼习惯&#xff0c;而现…

微信小程序——模板与配置,数据绑定,事件绑定

一.数据绑定1.数据绑定的基本原则在data中定义数据在WXML中使用数据2.在data中定义页面的数据在页面对应的.js文件中&#xff0c;把数据定义到data对象中即可3. Mustache 语法的格式把 data 中的数据绑定到页面中渲染&#xff0c;使用 Mustache 语法&#xff08;双大括号&#…

想提高办公效率?可试试java开源工作流框架

在数据化管理越来越规范的当今社会&#xff0c;采用优质的办公软件平台能提高企业的办公协作效率&#xff0c;因而受到了广泛的欢迎和喜爱。那么&#xff0c;什么是java开源工作流框架&#xff1f;我们可以从它的特点、发展前景等方面来加以了解&#xff0c;一起来了解这一产品…

微信公众号运营工具有哪些?赶紧收藏

再厉害的公众号运营大神背后都有一套宝藏工具大全&#xff0c;辅助运营人一路披荆斩棘&#xff0c;堪称神器&#xff01; 我相信网上一搜也能出来很多的运营工具或是网站&#xff0c;但是这里再来给大家来一个大汇总&#xff0c;这次整理绝对是非常详细和实用的&#xff0c;纯…

Fiddler中常用的功能

Fiddler中常用的功能如下&#xff1a; 停止抓包-清空会话窗-内容过滤请求-解码-设置断点 一、 停止抓包 二、清空会话窗 方法一&#xff0c;工具栏工具&#xff1a; 方法二&#xff0c;命令行形式&#xff1a; 当然&#xff0c;命令行工具也还支持其他命令的输入&#xff0c…

word排版技巧:如何将段中文字生成标题目录

在许多Word文档里面&#xff0c;目录页是非常重要的一页内容&#xff0c;因为目录页展示的是当前文档的内容框型和结构。通过目录页&#xff0c;我们能知道这个文档主要分为哪几部分。就像看书一样&#xff0c;起到了检索的作用。今天&#xff0c;我们就来给大家分享一个偏门的…

焕新古文化传承之路,AI为古彝文识别赋能

目录1 古彝文与古典保护2 古文识别的挑战2.1 西文与汉文OCR2.2 古彝文识别难点3 合合信息&#xff1a;古彝文保护新思路3.1 图像矫正3.2 图像增强3.3 语义理解3.4 工程技巧4 总结1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&#xff0c;区别于现代意…