using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Abp.Dependency; using Abp.Domain.Repositories; using IwbZero.Authorization.Base.Permissions; using IwbZero.Authorization.Base.Roles; using IwbZero.Authorization.Base.Users; using IwbZero.Authorization.Users; using Microsoft.AspNet.Identity; namespace IwbZero.Authorization.Roles { /// /// Implements 'Role Store' of ASP.NET Identity Framework. /// public abstract class IwbRoleStore : IQueryableRoleStore, IRolePermissionStore, ITransientDependency where TRole : IwbSysRole, new() where TUser : IwbSysUser { private readonly IRepository _roleRepository; private readonly IRepository _userRoleRepository; private readonly IRepository _permissionSettingRepository; /// /// Constructor. /// protected IwbRoleStore( IRepository roleRepository, IRepository userRoleRepository, IRepository permissionSettingRepository) { _roleRepository = roleRepository; _userRoleRepository = userRoleRepository; _permissionSettingRepository = permissionSettingRepository; } public virtual IQueryable Roles => _roleRepository.GetAll(); public virtual async Task CreateAsync(TRole role) { await _roleRepository.InsertAsync(role); } public virtual async Task UpdateAsync(TRole role) { await _roleRepository.UpdateAsync(role); } public virtual async Task DeleteAsync(TRole role) { await _userRoleRepository.DeleteAsync(ur => ur.RoleId == role.Id); await _roleRepository.DeleteAsync(role); } public virtual async Task FindByIdAsync(int roleId) { return await _roleRepository.FirstOrDefaultAsync(a => a.Id == roleId); } public virtual async Task FindByNameAsync(string roleName) { var normalizedName = NormalizeKey(roleName); return await _roleRepository.FirstOrDefaultAsync( role => role.NormalizedName == normalizedName ); } public virtual async Task FindByDisplayNameAsync(string displayName) { return await _roleRepository.FirstOrDefaultAsync( role => role.DisplayName == displayName ); } public virtual async Task AddPermissionAsync(TRole role, PermissionGrantInfo permissionGrant) { if (await HasPermissionAsync(role.Id, permissionGrant)) { return; } await _permissionSettingRepository.InsertAsync(new PermissionSetting { TenantId = role.TenantId, Master = 1, MasterValue = role.Id + "", Name = permissionGrant.Name, IsGranted = permissionGrant.IsGranted }); } /// public virtual async Task RemovePermissionAsync(TRole role, PermissionGrantInfo permissionGrant) { await _permissionSettingRepository.DeleteAsync( a => a.MasterValue == role.Id + "" && a.Master == 1 && a.Name == permissionGrant.Name && a.IsGranted == permissionGrant.IsGranted ); } /// public virtual Task> GetPermissionsAsync(TRole role) { return GetPermissionsAsync(role.Id); } public async Task> GetPermissionsAsync(int roleId) { return (await _permissionSettingRepository.GetAllListAsync(p => p.Master == 1 && p.MasterValue == roleId + "")) .Select(p => new PermissionGrantInfo(p.Name, p.Access, p.AccessValue, p.IsGranted)) .ToList(); } /// public virtual async Task HasPermissionAsync(int roleId, PermissionGrantInfo permissionGrant) { return await _permissionSettingRepository.FirstOrDefaultAsync( p => p.Master == 1 && p.MasterValue == roleId + "" && p.Name == permissionGrant.Name && p.IsGranted == permissionGrant.IsGranted ) != null; } /// public virtual async Task RemoveAllPermissionSettingsAsync(TRole role) { await _permissionSettingRepository.DeleteAsync(s => s.Master == 1 && s.MasterValue == role.Id + ""); } protected virtual string NormalizeKey(string key) { return key.ToUpperInvariant(); } public virtual void Dispose() { //No need to dispose since using IOC. } } }