a、Core层 Authorization.Users.UserStore.cs

    public class UserStore : AbpUserStore<Role, User>
{
private readonly IRepository<User, long> _userRepository; public UserStore(
IUnitOfWorkManager unitOfWorkManager,
IRepository<User, long> userRepository,
IRepository<Role> roleRepository,
IAsyncQueryableExecuter asyncQueryableExecuter,
IRepository<UserRole, long> userRoleRepository,
IRepository<UserLogin, long> userLoginRepository,
IRepository<UserClaim, long> userClaimRepository,
IRepository<UserPermissionSetting, long> userPermissionSettingRepository,
IRepository<UserOrganizationUnit, long> userOrganizationUnitRepository,
IRepository<OrganizationUnitRole, long> organizationUnitRoleRepository)
: base(
unitOfWorkManager,
userRepository,
roleRepository,
asyncQueryableExecuter,
userRoleRepository,
userLoginRepository,
userClaimRepository,
userPermissionSettingRepository,
userOrganizationUnitRepository,
organizationUnitRoleRepository)
{
_userRepository = userRepository;
} /// <summary>
/// 根据账号获取用户
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
public virtual async Task<User> FindByAccountAsync(string account)
{
account = account.ToLower();
return await _userRepository.FirstOrDefaultAsync(
user => user.UserName.ToLower() == account
);
}
}

b、Core层 Authorization.LogInManager.cs

    public class LogInManager : AbpLogInManager<Tenant, Role, User>
{ private readonly UserStore _userStore;
private readonly AbpUserManager<Role, User> _userManager; public LogInManager(
UserManager userManager,
IMultiTenancyConfig multiTenancyConfig,
IRepository<Tenant> tenantRepository,
IUnitOfWorkManager unitOfWorkManager,
ISettingManager settingManager,
IRepository<UserLoginAttempt, long> userLoginAttemptRepository,
IUserManagementConfig userManagementConfig,
IIocResolver iocResolver,
IPasswordHasher<User> passwordHasher,
RoleManager roleManager,
UserClaimsPrincipalFactory claimsPrincipalFactory,
UserStore userStore)
: base(
userManager,
multiTenancyConfig,
tenantRepository,
unitOfWorkManager,
settingManager,
userLoginAttemptRepository,
userManagementConfig,
iocResolver,
passwordHasher,
roleManager,
claimsPrincipalFactory)
{
_userStore = userStore;
_userManager = userManager;
} /// <summary>
/// 自定义登录
/// </summary>
/// <param name="account">账号、手机号、身份证号</param>
/// <param name="password">明文密码</param>
/// <returns></returns>
[UnitOfWork]
public virtual async Task<AbpLoginResult<Tenant, User>> LoginCustomAsync(string account, string password)
{
var result = await LoginCustomAsyncInternal(account, password); //保存用户尝试登录的记录
await SaveLoginAttemptAsync(result, null, account);
return result;
} protected virtual async Task<AbpLoginResult<Tenant, User>> LoginCustomAsyncInternal(string account, string password)
{
if (account.IsNullOrEmpty() || password.IsNullOrEmpty())
{
throw new ArgumentException("account or password");
} //不启用租户,获取默认租户
Tenant tenant = await GetDefaultTenantAsync(); int? tenantId = tenant?.Id;
using (UnitOfWorkManager.Current.SetTenantId(tenantId))
{
//根据用户名获取用户信息
var user = await _userStore.FindByAccountAsync(account);
if (user == null)
{
return new AbpLoginResult<Tenant, User>(AbpLoginResultType.UnknownExternalLogin, tenant);
} //验证用户的密码是否正确
var verificationResult = _userManager.PasswordHasher.VerifyHashedPassword(user, user.Password, password);
if (verificationResult != PasswordVerificationResult.Success)
{
if (await TryLockOutAsync(tenantId, user.Id))
{
return new AbpLoginResult<Tenant, User>(AbpLoginResultType.LockedOut, tenant, user);
} return new AbpLoginResult<Tenant, User>(AbpLoginResultType.InvalidPassword, tenant, user);
} //重置用户登录失败次数
await _userManager.ResetAccessFailedCountAsync(user); //生成登录结果
return await CreateLoginResultAsync(user, tenant);
}
}
}

c、Web.Core层

添加方法:

        /// <summary>
/// 自定义登录
/// </summary>
/// <param name="userName">账号、身份证、手机号</param>
/// <param name="password"></param>
/// <returns></returns>
private async Task<AbpLoginResult<Tenant, User>> GetCustomLoginResultAsync(string userName, string password)
{
var loginResult = await _logInManager.LoginCustomAsync(userName, password); switch (loginResult.Result)
{
case AbpLoginResultType.Success:
return loginResult;
default:
throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(loginResult.Result, userName, null);
}
}

重构方法:

        [HttpPost]
public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
{
//var loginResult = await GetLoginResultAsync(
// model.UserNameOrEmailAddress,
// model.Password,
// GetTenancyNameOrNull()
//); //自定义登录获取结果
var loginResult = await GetCustomLoginResultAsync(
model.UserNameOrEmailAddress,
model.Password
); var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity)); return new AuthenticateResultModel
{
AccessToken = accessToken,
EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
UserId = loginResult.User.Id
};
}

abp重构登录的更多相关文章

  1. Abp zero 登录 添加腾讯云验证码

    腾讯云验证码是为网页.App.小程序开发者提供的安全验证服务,基于腾讯多年的大数据积累和人工智能决策引擎,构建智能分级验证模型,最大程度保护业务安全的同时,提供更精细化的用户体验. 腾讯云--> ...

  2. 新建一个项目,如何使用abp用户登录系统

    1.首先参考Framework.Web里的packages.config,把相关的包都安装好. 2.App_Start文件夹下的xxxModule.cs和Startup.cs拷过来,修改下命名空间. ...

  3. ABP Zero集成微信小程序登录

    首先是ABPZero的第三方登录模块,通过调用第三方的登录接口返回用户信息,再交给ABP的登录验证模块去执行对应的登录注册. 涉及的数据库表主要是这两个表,AbpUsers存储了用户信息,AbpUse ...

  4. 知识全聚集 .Net Core 技术突破 丨ABP vNext 开始

    介绍 很久没有更新博客了,之前想更新但是发现博客园崩了,外加工作上的调换也比较忙,最近有了点时间我来继续更新下这个系列的文章. 今年3月份我带着我们研发组同事,将公司产品从老Abp重构到Abp vNe ...

  5. 通过案例掌握Spring 管理事务的步骤及配置

    案例描述  通过完成生成订单业务,掌握事务处理.  需要d_order表和d_item表  订单生成时的业务逻辑:向d_order插入1条数据的同时,向t_item中插入若干条数据  这就是一个独立的 ...

  6. Java快速开发平台,JEECG 3.7.6性能增强版本发布

    JEECG 3.7.6 性能增强版本发布 导读       ⊙Vue SPA单页面应用 ⊙Datagrid标签实现不同风格切换,支持BootstrapTable.EasyUI ⊙灵活通用代码生成器工厂 ...

  7. 《精通Ext JS 》

    <精通Ext JS > 基本信息 原书名:Mastering Ext JS 作者: (巴西)Loiane Groner 译者: 卢俊祥 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ...

  8. 项目Beta冲刺(4/7)(追光的人)(2019.5.26)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

  9. 项目Beta冲刺(3/7)(追光的人)(2019.5.25)

    所属课程 软件工程1916 作业要求 Beta冲刺博客汇总 团队名称 追光的人 作业目标 描述Beta冲刺每日的scrum和PM报告两部分 队员学号 队员博客 221600219 小墨 https:/ ...

随机推荐

  1. 安装apoc插件

    APOC是Neo4j 3.3版本推出时推荐的一个Java存储过程包,包含丰富的函数和存储过程,作为对Cypher所不能提供的复杂图算法和数据操作功能的补充,APOC还具有使用灵活.高性能等优势. 1. ...

  2. Vue好书推荐

    1.Vue.js实战 从基础知识到ui组件封装和剖析,层层推进,最后两个案例实战.适合零基础入门,学完可就业.(推荐看这本) 交流地址(pdf原件):链接(点击跳转):提取码:7IsG 2.vue.j ...

  3. PMBOK 基础知识(1)

    启动.结束过程 项目管理计划 第一章  引论 第2章项目运行环境 第3章 项目经理的角色 第4章 项目整合管理 第5章 项目范围管理 第6章 项目进度管理 第7章 项目成本管理 第8章 项目质量管理  ...

  4. 网络KPI异常检测之时序分解算法

    时间序列数据伴随着我们的生活和工作.从牙牙学语时的“1, 2, 3, 4, 5, ……”到房价的走势变化,从金融领域的刷卡记录到运维领域的核心网性能指标.时间序列中的规律能加深我们对事物和场景的认识, ...

  5. 使用jdk1.8 stream特性对参数名称进行排序

    在对外对接的时候,通常会碰到签名方式, 然后签名的时候,要求按照参数名称进行排序. 比如参数为 c=22&a=1, 需要将结果排序为a=1&c=22, 然后再进行别的运算. 可以使用j ...

  6. STL容器操作

    目录 1. 数组 2. Vector 3. List 3.1. std::forward_list 4. Tuple 4.1. 运行期索引 4.2. 元组合并 4.3. 元祖遍历 5. Pair 6. ...

  7. Linux使用手册

    一.开关机 sync :把内存中的数据写到磁盘中(关机.重启前都需先执行sync) shutdown -rnow或reboot :立刻重启 shutdown -hnow :立刻关机 shutdown ...

  8. TestLoader源码解析

    def loadTestsFromTestCase(self, testCaseClass) #看名称分析:从TestCase找测试集--那么就是把我们的def用例加载到testSuit里面 def ...

  9. 一文搞懂:Adaboost及手推算法案例

    boosting Boosting 算法的特点在于:将表现一般的弱分类器通过组合变成更好的模型.代表自然就是我们的随即森林了. GBDT和Adaboost是boost算法中比较常见的两种,这里主要讲解 ...

  10. python django 批量上传文件并绑定对应文件的描述