fix: 管理后台登录按Portal精确匹配

This commit is contained in:
2026-01-29 11:41:24 +00:00
parent b90929dfaf
commit 7661c2aea1
4 changed files with 102 additions and 84 deletions

View File

@@ -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">租户 IDPortal=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>
/// 判断账号是否存在。