using Abp;
using Abp.Dependency;
using Abp.Domain.Repositories;
using Abp.Domain.Uow;
using Abp.Extensions;
using Castle.Core.Logging;
using Microsoft.AspNetCore.Identity;
using System.Security.Claims;
using VberZero.BaseSystem.Roles;
using VberZero.Tools;
using ILogger = Castle.Core.Logging.ILogger;
namespace VberZero.Authorization.Roles;
///
/// 为角色创建持久性存储的新实例
///
public class VzRoleStore :
IRoleStore,
IRoleClaimStore,
IRolePermissionStore,
IQueryableRoleStore,
ITransientDependency
{
public ILogger Logger { get; set; }
///
/// 获取或设置当前操作发生的任何错误的
///
public IdentityErrorDescriber ErrorDescriber { get; set; }
///
/// 获取或设置一个标志,该标志指示在调用 CreateAsync、UpdateAsync 和 DeleteAsync 后是否应保存。
///
///
/// 如果应自动保存,则为 true,否则为 false。
///
public bool AutoSaveChanges { get; set; } = true;
public IQueryable Roles => _roleRepository.GetAll();
private readonly IRepository _roleRepository;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IRepository _rolePermissionSettingRepository;
public VzRoleStore(
IUnitOfWorkManager unitOfWorkManager,
IRepository roleRepository,
IRepository rolePermissionSettingRepository)
{
_unitOfWorkManager = unitOfWorkManager;
_roleRepository = roleRepository;
_rolePermissionSettingRepository = rolePermissionSettingRepository;
ErrorDescriber = new IdentityErrorDescriber();
Logger = NullLogger.Instance;
}
///
/// 保存当前库
///
/// 取消操作的通知
///
protected Task SaveChanges(CancellationToken cancellationToken)
{
if (!AutoSaveChanges || _unitOfWorkManager.Current == null)
{
return Task.CompletedTask;
}
return _unitOfWorkManager.Current.SaveChangesAsync();
}
///
/// 创建一个新角色
///
///
/// 取消操作的通知
///
public virtual async Task CreateAsync(Role role, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
await _roleRepository.InsertAsync(role);
await SaveChanges(cancellationToken);
return IdentityResult.Success;
});
}
///
/// 更新一个新角色
///
///
/// 取消操作的通知
///
public virtual async Task UpdateAsync(Role role, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
role.ConcurrencyStamp = Guid.NewGuid().ToString();
await _roleRepository.UpdateAsync(role);
try
{
await SaveChanges(cancellationToken);
}
catch (AbpDbConcurrencyException ex)
{
Logger.Warn(ex.ToString(), ex);
return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure());
}
await SaveChanges(cancellationToken);
return IdentityResult.Success;
});
}
///
/// 删除一个新角色
///
///
/// 取消操作的通知
///
public virtual async Task DeleteAsync(Role role, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
await _roleRepository.DeleteAsync(role);
try
{
await SaveChanges(cancellationToken);
}
catch (AbpDbConcurrencyException ex)
{
Logger.Warn(ex.ToString(), ex);
return IdentityResult.Failed(ErrorDescriber.ConcurrencyFailure());
}
await SaveChanges(cancellationToken);
return IdentityResult.Success;
});
}
///
/// 获取角色的 ID
///
///
/// 取消操作的通知
///
public Task GetRoleIdAsync(Role role, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
return Task.FromResult(role.Id.ToString());
}
///
/// 获取角色的 Name
///
///
/// 取消操作的通知
///
public Task GetRoleNameAsync(Role role, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
return Task.FromResult(role.Name);
}
///
/// 设置角色名称
///
///
///
/// 取消操作的通知
///
public Task SetRoleNameAsync(Role role, string roleName, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
role.Name = roleName;
return Task.CompletedTask;
}
///
/// 查询指定 ID 的角色
///
///
/// 取消操作的通知
///
public virtual async Task FindByIdAsync(string id, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
return await _roleRepository.FirstOrDefaultAsync(id.To());
});
}
///
/// 查询指定 ID 的角色
///
///
/// 取消操作的通知
///
public virtual Role FindById(string id, CancellationToken cancellationToken = default)
{
return _unitOfWorkManager.WithUnitOfWork(() =>
{
cancellationToken.ThrowIfCancellationRequested();
return _roleRepository.FirstOrDefault(id.To());
});
}
///
/// 查询指定 Name 的角色
///
///
/// 取消操作的通知
///
public virtual async Task FindByNameAsync(string normalizedName, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(normalizedName, nameof(normalizedName));
return await _roleRepository.FirstOrDefaultAsync(r => r.NormalizedName == normalizedName);
});
}
///
/// 查询指定 Name 的角色
///
///
/// 取消操作的通知
///
public virtual Role FindByName(string normalizedName, CancellationToken cancellationToken = default)
{
return _unitOfWorkManager.WithUnitOfWork(() =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(normalizedName, nameof(normalizedName));
return _roleRepository.FirstOrDefault(r => r.NormalizedName == normalizedName);
});
}
///
/// 获取角色的规范化名称
///
///
/// 取消操作的通知
///
public virtual Task GetNormalizedRoleNameAsync(Role role, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
return Task.FromResult(role.NormalizedName);
}
///
/// 设置角色的规范化名称
///
///
/// The normalized name to set
/// 取消操作的通知
///
public virtual Task SetNormalizedRoleNameAsync(Role role, string normalizedName, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
role.NormalizedName = normalizedName;
return Task.CompletedTask;
}
///
/// Dispose
///
public void Dispose()
{
}
///
/// 获取与指定的 关联的声明
///
///
/// 取消操作的通知
///
public virtual async Task> GetClaimsAsync(Role role, CancellationToken cancellationToken = default)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
await _roleRepository.EnsureCollectionLoadedAsync(role, u => u.Claims, cancellationToken);
return role.Claims.Select(c => new Claim(c.ClaimType, c.ClaimValue)).ToList();
});
}
///
/// 将给定的 添加到指定的
///
///
///
/// 取消操作的通知
///
public async Task AddClaimAsync(Role role, Claim claim, CancellationToken cancellationToken = default)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
cancellationToken.ThrowIfCancellationRequested();
Check.NotNull(role, nameof(role));
Check.NotNull(claim, nameof(claim));
await _roleRepository.EnsureCollectionLoadedAsync(role, u => u.Claims, cancellationToken);
role.Claims.Add(new RoleClaim(role, claim));
});
}
///
/// 从指定的 中移除给定的
///
///
///
/// 取消操作的通知
///
public async Task RemoveClaimAsync(Role role, Claim claim, CancellationToken cancellationToken = default)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
Check.NotNull(role, nameof(role));
Check.NotNull(claim, nameof(claim));
await _roleRepository.EnsureCollectionLoadedAsync(role, u => u.Claims, cancellationToken);
role.Claims.RemoveAll(c => c.ClaimValue == claim.Value && c.ClaimType == claim.Type);
});
}
public virtual async Task FindByDisplayNameAsync(string displayName)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
return await _roleRepository.FirstOrDefaultAsync(
role => role.DisplayName == displayName
);
});
}
public virtual async Task AddPermissionAsync(Role role, PermissionGrantInfo permissionGrant)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
if (await HasPermissionAsync(role.Id, permissionGrant))
{
return;
}
await _rolePermissionSettingRepository.InsertAsync(
new RolePermissionSetting(role.Id)
{
TenantId = role.TenantId,
//RoleId = role.Id,
Name = permissionGrant.Name,
IsGranted = permissionGrant.IsGranted
});
});
}
///
public virtual async Task RemovePermissionAsync(Role role, PermissionGrantInfo permissionGrant)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
await _rolePermissionSettingRepository.DeleteAsync(
permissionSetting => permissionSetting.RoleId == role.Id &&
permissionSetting.Name == permissionGrant.Name &&
permissionSetting.IsGranted == permissionGrant.IsGranted
);
});
}
///
public virtual Task> GetPermissionsAsync(Role role)
{
return GetPermissionsAsync(role.Id);
}
///
public virtual IList GetPermissions(Role role)
{
return GetPermissions(role.Id);
}
public async Task> GetPermissionsAsync(int roleId)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
return (await _rolePermissionSettingRepository.GetAllListAsync(p => p.RoleId == roleId))
.Select(p => new PermissionGrantInfo(p.Name, p.IsGranted))
.ToList();
});
}
public IList GetPermissions(int roleId)
{
return _unitOfWorkManager.WithUnitOfWork(() =>
{
return (_rolePermissionSettingRepository.GetAllList(p => p.RoleId == roleId))
.Select(p => new PermissionGrantInfo(p.Name, p.IsGranted))
.ToList();
});
}
///
public virtual async Task HasPermissionAsync(int roleId, PermissionGrantInfo permissionGrant)
{
return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
return await _rolePermissionSettingRepository.FirstOrDefaultAsync(
p => p.RoleId == roleId &&
p.Name == permissionGrant.Name &&
p.IsGranted == permissionGrant.IsGranted
) != null;
});
}
///
public virtual async Task RemoveAllPermissionSettingsAsync(Role role)
{
await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
{
await _rolePermissionSettingRepository.DeleteAsync(s => s.RoleId == role.Id);
});
}
}