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); }); } }