IwbRoleStore.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Abp.Dependency;
  5. using Abp.Domain.Repositories;
  6. using IwbZero.Authorization.Base.Permissions;
  7. using IwbZero.Authorization.Base.Roles;
  8. using IwbZero.Authorization.Base.Users;
  9. using IwbZero.Authorization.Users;
  10. using Microsoft.AspNet.Identity;
  11. namespace IwbZero.Authorization.Roles
  12. {
  13. /// <summary>
  14. /// Implements 'Role Store' of ASP.NET Identity Framework.
  15. /// </summary>
  16. public abstract class IwbRoleStore<TRole, TUser> :
  17. IQueryableRoleStore<TRole, int>,
  18. IRolePermissionStore<TRole>,
  19. ITransientDependency
  20. where TRole : IwbSysRole<TUser>, new()
  21. where TUser : IwbSysUser<TUser>
  22. {
  23. private readonly IRepository<TRole> _roleRepository;
  24. private readonly IRepository<UserRole, long> _userRoleRepository;
  25. private readonly IRepository<PermissionSetting, long> _permissionSettingRepository;
  26. /// <summary>
  27. /// Constructor.
  28. /// </summary>
  29. protected IwbRoleStore(
  30. IRepository<TRole> roleRepository,
  31. IRepository<UserRole, long> userRoleRepository,
  32. IRepository<PermissionSetting, long> permissionSettingRepository)
  33. {
  34. _roleRepository = roleRepository;
  35. _userRoleRepository = userRoleRepository;
  36. _permissionSettingRepository = permissionSettingRepository;
  37. }
  38. public virtual IQueryable<TRole> Roles => _roleRepository.GetAll();
  39. public virtual async Task CreateAsync(TRole role)
  40. {
  41. await _roleRepository.InsertAsync(role);
  42. }
  43. public virtual async Task UpdateAsync(TRole role)
  44. {
  45. await _roleRepository.UpdateAsync(role);
  46. }
  47. public virtual async Task DeleteAsync(TRole role)
  48. {
  49. await _userRoleRepository.DeleteAsync(ur => ur.RoleId == role.Id);
  50. await _roleRepository.DeleteAsync(role);
  51. }
  52. public virtual async Task<TRole> FindByIdAsync(int roleId)
  53. {
  54. return await _roleRepository.FirstOrDefaultAsync(a => a.Id == roleId);
  55. }
  56. public virtual async Task<TRole> FindByNameAsync(string roleName)
  57. {
  58. var normalizedName = NormalizeKey(roleName);
  59. return await _roleRepository.FirstOrDefaultAsync(
  60. role => role.NormalizedName == normalizedName
  61. );
  62. }
  63. public virtual async Task<TRole> FindByDisplayNameAsync(string displayName)
  64. {
  65. return await _roleRepository.FirstOrDefaultAsync(
  66. role => role.DisplayName == displayName
  67. );
  68. }
  69. public virtual async Task AddPermissionAsync(TRole role, PermissionGrantInfo permissionGrant)
  70. {
  71. if (await HasPermissionAsync(role.Id, permissionGrant))
  72. {
  73. return;
  74. }
  75. await _permissionSettingRepository.InsertAsync(new PermissionSetting
  76. {
  77. TenantId = role.TenantId,
  78. Master = 1,
  79. MasterValue = role.Id + "",
  80. Name = permissionGrant.Name,
  81. IsGranted = permissionGrant.IsGranted
  82. });
  83. }
  84. /// <inheritdoc/>
  85. public virtual async Task RemovePermissionAsync(TRole role, PermissionGrantInfo permissionGrant)
  86. {
  87. await _permissionSettingRepository.DeleteAsync(
  88. a => a.MasterValue == role.Id + "" && a.Master == 1 &&
  89. a.Name == permissionGrant.Name &&
  90. a.IsGranted == permissionGrant.IsGranted
  91. );
  92. }
  93. /// <inheritdoc/>
  94. public virtual Task<IList<PermissionGrantInfo>> GetPermissionsAsync(TRole role)
  95. {
  96. return GetPermissionsAsync(role.Id);
  97. }
  98. public async Task<IList<PermissionGrantInfo>> GetPermissionsAsync(int roleId)
  99. {
  100. return (await _permissionSettingRepository.GetAllListAsync(p => p.Master == 1 && p.MasterValue == roleId + ""))
  101. .Select(p => new PermissionGrantInfo(p.Name, p.Access, p.AccessValue, p.IsGranted))
  102. .ToList();
  103. }
  104. /// <inheritdoc/>
  105. public virtual async Task<bool> HasPermissionAsync(int roleId, PermissionGrantInfo permissionGrant)
  106. {
  107. return await _permissionSettingRepository.FirstOrDefaultAsync(
  108. p => p.Master == 1 && p.MasterValue == roleId + "" &&
  109. p.Name == permissionGrant.Name &&
  110. p.IsGranted == permissionGrant.IsGranted
  111. ) != null;
  112. }
  113. /// <inheritdoc/>
  114. public virtual async Task RemoveAllPermissionSettingsAsync(TRole role)
  115. {
  116. await _permissionSettingRepository.DeleteAsync(s => s.Master == 1 && s.MasterValue == role.Id + "");
  117. }
  118. protected virtual string NormalizeKey(string key)
  119. {
  120. return key.ToUpperInvariant();
  121. }
  122. public virtual void Dispose()
  123. {
  124. //No need to dispose since using IOC.
  125. }
  126. }
  127. }