fix: 管理后台登录按Portal精确匹配
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using TakeoutSaaS.Domain.Identity.Entities;
|
||||
using TakeoutSaaS.Domain.Identity.Enums;
|
||||
using TakeoutSaaS.Domain.Identity.Repositories;
|
||||
|
||||
namespace TakeoutSaaS.Infrastructure.Identity.Persistence;
|
||||
@@ -12,11 +14,40 @@ public sealed class EfIdentityUserRepository(IdentityDbContext dbContext) : IIde
|
||||
/// <summary>
|
||||
/// 根据账号获取后台用户。
|
||||
/// </summary>
|
||||
/// <param name="portal">Portal 类型。</param>
|
||||
/// <param name="tenantId">租户 ID(Portal=Tenant 时必填;Portal=Admin 时必须为空)。</param>
|
||||
/// <param name="account">账号。</param>
|
||||
/// <param name="cancellationToken">取消标记。</param>
|
||||
/// <returns>后台用户或 null。</returns>
|
||||
public Task<IdentityUser?> FindByAccountAsync(string account, CancellationToken cancellationToken = default)
|
||||
=> dbContext.IdentityUsers.AsNoTracking().FirstOrDefaultAsync(x => x.Account == account, cancellationToken);
|
||||
public Task<IdentityUser?> FindByAccountAsync(
|
||||
PortalType portal,
|
||||
long? tenantId,
|
||||
string account,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
// 1. 参数校验
|
||||
if (string.IsNullOrWhiteSpace(account))
|
||||
{
|
||||
throw new ArgumentException("账号不能为空。", nameof(account));
|
||||
}
|
||||
|
||||
// 2. (空行后) 标准化账号
|
||||
var normalized = account.Trim();
|
||||
|
||||
// 3. (空行后) 按 Portal 进行精确匹配
|
||||
return portal switch
|
||||
{
|
||||
PortalType.Admin when tenantId is null => dbContext.IdentityUsers
|
||||
.AsNoTracking()
|
||||
.FirstOrDefaultAsync(x => x.Portal == PortalType.Admin && x.Account == normalized, cancellationToken),
|
||||
PortalType.Admin => throw new ArgumentException("Portal=Admin 时 tenantId 必须为空。", nameof(tenantId)),
|
||||
PortalType.Tenant when tenantId.HasValue && tenantId.Value > 0 => dbContext.IdentityUsers
|
||||
.AsNoTracking()
|
||||
.FirstOrDefaultAsync(x => x.Portal == PortalType.Tenant && x.TenantId == tenantId.Value && x.Account == normalized, cancellationToken),
|
||||
PortalType.Tenant => throw new ArgumentException("Portal=Tenant 时必须指定 tenantId。", nameof(tenantId)),
|
||||
_ => throw new ArgumentOutOfRangeException(nameof(portal), portal, "未知 Portal 类型。")
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断账号是否存在。
|
||||
|
||||
Reference in New Issue
Block a user