forked from xiongyuxing/tiku-backend.net
perf: optimize authorization scoreline and workers
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Tiku.Application.Security;
|
||||
using Tiku.Application.Auth;
|
||||
using Tiku.Domain.Identity;
|
||||
using Tiku.Domain.Operations;
|
||||
using Tiku.Domain.Tenancy;
|
||||
@@ -10,6 +11,7 @@ namespace Tiku.Infrastructure.Security;
|
||||
internal sealed class CurrentAccessContext(
|
||||
ICurrentUser currentUser,
|
||||
ITenantContext tenantContext,
|
||||
IRequestSecurityState requestSecurityState,
|
||||
TikuDbContext dbContext) : ICurrentAccessContext
|
||||
{
|
||||
private Task<CurrentAccessSnapshot>? snapshotTask;
|
||||
@@ -28,23 +30,30 @@ internal sealed class CurrentAccessContext(
|
||||
return Empty();
|
||||
}
|
||||
|
||||
var isUserActive = await dbContext.Users.AsNoTracking()
|
||||
.AnyAsync(user => user.Id == userId && user.Status == UserStatus.Active, cancellationToken);
|
||||
if (!isUserActive)
|
||||
var validatedSession = requestSecurityState.ValidatedSession;
|
||||
var isValidated = validatedSession is not null &&
|
||||
validatedSession.UserId == userId &&
|
||||
validatedSession.TenantId == tenantContext.TenantId;
|
||||
if (!isValidated)
|
||||
{
|
||||
return new CurrentAccessSnapshot(
|
||||
userId,
|
||||
tenantContext.TenantId,
|
||||
false,
|
||||
false,
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
CurrentDataScope.Self);
|
||||
var isUserActive = await dbContext.Users.AsNoTracking()
|
||||
.AnyAsync(user => user.Id == userId && user.Status == UserStatus.Active, cancellationToken);
|
||||
if (!isUserActive)
|
||||
{
|
||||
return new CurrentAccessSnapshot(
|
||||
userId,
|
||||
tenantContext.TenantId,
|
||||
false,
|
||||
false,
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
CurrentDataScope.Self);
|
||||
}
|
||||
}
|
||||
|
||||
var platformPermissions = await LoadPlatformPermissionsAsync(userId, cancellationToken);
|
||||
if (tenantContext.TenantId is not { } tenantId)
|
||||
{
|
||||
var platformPermissions = await LoadPlatformPermissionsAsync(userId, cancellationToken);
|
||||
return new CurrentAccessSnapshot(
|
||||
userId,
|
||||
null,
|
||||
@@ -55,25 +64,27 @@ internal sealed class CurrentAccessContext(
|
||||
CurrentDataScope.Self);
|
||||
}
|
||||
|
||||
var isTenantActive = await dbContext.Tenants.AsNoTracking()
|
||||
.AnyAsync(tenant => tenant.Id == tenantId && tenant.Status == TenantStatus.Active, cancellationToken);
|
||||
var isActiveMember = isTenantActive && await dbContext.TenantMemberships.AsNoTracking()
|
||||
.AnyAsync(
|
||||
membership => membership.TenantId == tenantId &&
|
||||
membership.UserId == userId &&
|
||||
membership.Status == MembershipStatus.Active,
|
||||
cancellationToken);
|
||||
|
||||
if (!isActiveMember)
|
||||
if (!isValidated)
|
||||
{
|
||||
return new CurrentAccessSnapshot(
|
||||
userId,
|
||||
tenantId,
|
||||
true,
|
||||
false,
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
platformPermissions,
|
||||
CurrentDataScope.Self);
|
||||
var isTenantActive = await dbContext.Tenants.AsNoTracking()
|
||||
.AnyAsync(tenant => tenant.Id == tenantId && tenant.Status == TenantStatus.Active, cancellationToken);
|
||||
var isActiveMember = isTenantActive && await dbContext.TenantMemberships.AsNoTracking()
|
||||
.AnyAsync(
|
||||
membership => membership.TenantId == tenantId &&
|
||||
membership.UserId == userId &&
|
||||
membership.Status == MembershipStatus.Active,
|
||||
cancellationToken);
|
||||
if (!isActiveMember)
|
||||
{
|
||||
return new CurrentAccessSnapshot(
|
||||
userId,
|
||||
tenantId,
|
||||
true,
|
||||
false,
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
CurrentDataScope.Self);
|
||||
}
|
||||
}
|
||||
|
||||
var tenantRoles = await (
|
||||
@@ -106,7 +117,7 @@ internal sealed class CurrentAccessContext(
|
||||
true,
|
||||
true,
|
||||
tenantPermissions,
|
||||
platformPermissions,
|
||||
new HashSet<string>(StringComparer.Ordinal),
|
||||
CurrentDataScope.Merge(tenantRoles.Select(role => role.DataScope)));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user