RoleAppServiceBase.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. using Abp.Application.Services.Dto;
  2. using Abp.Auditing;
  3. using Abp.Authorization;
  4. using Abp.Domain.Repositories;
  5. using Abp.Extensions;
  6. using Abp.Linq.Extensions;
  7. using Abp.MultiTenancy;
  8. using Abp.Runtime.Caching;
  9. using Microsoft.EntityFrameworkCore;
  10. using System.Security.Cryptography;
  11. using VberZero.AppService.Base;
  12. using VberZero.AppService.Base.Dto;
  13. using VberZero.AppService.Roles.Dto;
  14. using VberZero.Auditing;
  15. using VberZero.Authorization.Roles;
  16. using VberZero.Authorization.Users;
  17. using VberZero.BaseSystem;
  18. using VberZero.BaseSystem.Roles;
  19. using VberZero.BaseSystem.Users;
  20. using VberZero.Session;
  21. using VberZero.Tools.StringModel;
  22. namespace VberZero.AppService.Roles;
  23. [AbpAuthorize, AuditLog("角色管理", "角色")]
  24. public class RoleAppServiceBase : VzCrudAppServiceBase<Role, RoleDto, int, VzPagedRequestDto, CreateRoleDto, UpdateRoleDto>, IRoleAppServiceBase
  25. {
  26. private readonly VzRoleManager _roleManager;
  27. private readonly VzUserManager _userManager;
  28. private readonly IRepository<SysFunction, int?> _funRepository;
  29. public RoleAppServiceBase(IRepository<Role> repository, VzRoleManager roleManager, VzUserManager userManager, IRepository<SysFunction, int?> funRepository)
  30. : base(repository)
  31. {
  32. _roleManager = roleManager;
  33. _userManager = userManager;
  34. _funRepository = funRepository;
  35. }
  36. #region CURD
  37. public override async Task Create(CreateRoleDto input)
  38. {
  39. CheckCreatePermission();
  40. input.Name = string.IsNullOrEmpty(input.Name) ? $"{AbpSession.TenantId ?? 0}{DateTime.Now:yyMMdd}{RandomNumberGenerator.GetInt32(100000, 999999)}" : input.Name;
  41. var role = MapToEntity(input);
  42. role.SetNormalizedName();
  43. CheckErrors(await _roleManager.CreateAsync(role));
  44. if (input.PermissionNames is { Count: > 0 })
  45. {
  46. var grantedPermissions = PermissionManager
  47. .GetAllPermissions()
  48. .Where(p => input.PermissionNames.Contains(p.Name))
  49. .ToList();
  50. await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
  51. }
  52. }
  53. [DisableAuditing]
  54. public async Task<ListResultDto<RoleListDto>> GetRolesAsync(GetRolesInput input)
  55. {
  56. var roles = await _roleManager
  57. .Roles
  58. .WhereIf(
  59. !input.Permission.IsNullOrWhiteSpace(),
  60. r => r.Permissions.Any(rp => rp.Name == input.Permission && rp.IsGranted)
  61. )
  62. .ToListAsync();
  63. return new ListResultDto<RoleListDto>(ObjectMapper.Map<List<RoleListDto>>(roles));
  64. }
  65. public override async Task Update(UpdateRoleDto input)
  66. {
  67. CheckUpdatePermission();
  68. var role = await _roleManager.GetRoleByIdAsync(input.Id);
  69. if (role.IsStatic && AbpSession.GetUserName() != User.AdminUserName)
  70. {
  71. CheckErrors("系统内置角色不能修改!");
  72. }
  73. ObjectMapper.Map(input, role);
  74. CheckErrors(await _roleManager.UpdateAsync(role));
  75. if (input.PermissionNames is { Count: > 0 })
  76. {
  77. var grantedPermissions = PermissionManager
  78. .GetAllPermissions()
  79. .Where(p => input.PermissionNames.Contains(p.Name))
  80. .ToList();
  81. await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions);
  82. }
  83. }
  84. public override async Task Delete(VzEntityDto<int> input)
  85. {
  86. CheckDeletePermission();
  87. var role = await _roleManager.FindByIdAsync(input.Id.ToString());
  88. var users = await _userManager.GetUsersInRoleAsync(role.NormalizedName);
  89. foreach (var user in users)
  90. {
  91. CheckErrors(await _userManager.RemoveFromRoleAsync(user, role.NormalizedName));
  92. }
  93. CheckErrors(await _roleManager.DeleteAsync(role));
  94. }
  95. [DisableAuditing]
  96. public override async Task<PagedResultDto<RoleDto>> GetAll(VzPagedRequestDto input)
  97. {
  98. var query = CreateFilteredQuery(input);
  99. #pragma warning disable CS0162
  100. if (AbpSession.GetUserName() != User.AdminUserName && AbpSession.GetUserName() != User.SystemUserName && !(VzConsts.MultiTenancyEnabled && AbpSession.MultiTenancySide.HasFlag(MultiTenancySides.Host)))
  101. #pragma warning restore CS0162
  102. query = query.Where(a => a.Name != User.AdminUserName && a.Name != User.SystemUserName &&
  103. (a.UserType > AbpSession.GetUserType()) &&
  104. (AbpSession.GetAccountType() == VzDefinition.AccountType.System || a.AccountType == AbpSession.GetAccountType()));
  105. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  106. query = ApplySorting(query, input);
  107. query = ApplyPaging(query, input);
  108. var entities = await AsyncQueryableExecuter.ToListAsync(query);
  109. return new PagedResultDto<RoleDto>(totalCount, entities.Select(MapToEntityDto).ToList());
  110. }
  111. protected override IQueryable<T> SelfSorting<T>(IQueryable<T> query, VzPagedRequestDto input)
  112. {
  113. if (query is IQueryable<Role> queryable)
  114. return (IQueryable<T>)queryable.OrderBy(r => r.DisplayName);
  115. return query;
  116. }
  117. protected override IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, string keyword)
  118. {
  119. if (query is IQueryable<Role> queryable)
  120. return (IQueryable<T>)queryable.WhereIf(keyword.NotEmpty(), a =>
  121. a.Name.Contains(keyword) || a.DisplayName.Contains(keyword));
  122. return query;
  123. }
  124. #endregion CURD
  125. [DisableAuditing]
  126. public async Task<GetRoleForEditOutput> GetRoleForEdit(EntityDto input)
  127. {
  128. var permissions = PermissionManager.GetAllPermissions();
  129. var role = await _roleManager.GetRoleByIdAsync(input.Id);
  130. var grantedPermissions = (await _roleManager.GetGrantedPermissionsAsync(role)).ToArray();
  131. var roleEditDto = ObjectMapper.Map<RoleEditDto>(role);
  132. return new GetRoleForEditOutput
  133. {
  134. Role = roleEditDto,
  135. Permissions = ObjectMapper.Map<List<FlatPermissionDto>>(permissions).OrderBy(p => p.DisplayName).ToList(),
  136. GrantedPermissionNames = grantedPermissions.Select(p => p.Name).ToList()
  137. };
  138. }
  139. #region Permission
  140. [DisableAuditing]
  141. public Task<ListResultDto<PermissionDto>> GetAllPermissions()
  142. {
  143. var permissions = PermissionManager.GetAllPermissions();
  144. return Task.FromResult(new ListResultDto<PermissionDto>(
  145. ObjectMapper.Map<List<PermissionDto>>(permissions).OrderBy(p => p.DisplayName).ToList()
  146. ));
  147. }
  148. /// <summary>
  149. /// 角色权限
  150. /// </summary>
  151. /// <param name="roleId"></param>
  152. /// <returns></returns>
  153. [DisableAuditing]
  154. public async Task<PermissionDto> GetPermissions(int roleId)
  155. {
  156. var allPermissions = PermissionManager.GetAllPermissions();
  157. List<Permission> currentPerms = new List<Permission>();
  158. if (AbpSession.GetUserName() == User.AdminUserName || AbpSession.GetUserName() == User.SystemUserName)
  159. {
  160. currentPerms.AddRange(allPermissions);
  161. }
  162. else
  163. {
  164. foreach (var perm in allPermissions)
  165. {
  166. if (await PermissionChecker.IsGrantedAsync(perm.Name))
  167. currentPerms.Add(perm);
  168. }
  169. }
  170. var rootFunc = await CacheManager.GetCache<string, SysFunction>(VzConsts.CacheFunction)
  171. .GetAsync(VzConsts.FunRootName, () => _funRepository.FirstOrDefaultAsync(a => a.Name == VzConsts.FunRootName));
  172. var dto = new PermissionDto();
  173. if (rootFunc != null)
  174. {
  175. dto.Name = rootFunc.Name;
  176. dto.IsAuth = roleId != 0 && await _roleManager.IsGrantedAsync(roleId, rootFunc.PermissionName);
  177. dto.DisplayName = rootFunc.DisplayName;
  178. dto.Sort = rootFunc.Sort;
  179. dto.Icon = rootFunc.Icon;
  180. dto.IsOpen = rootFunc.Depth < 2;
  181. dto.Children = await GetPermissionTree(rootFunc.PermissionName, currentPerms, roleId);
  182. }
  183. return dto;
  184. }
  185. /// <summary>
  186. /// 获取角色权限树
  187. /// </summary>
  188. /// <param name="parentName"></param>
  189. /// <param name="permissions"></param>
  190. /// <param name="roleId"></param>
  191. /// <returns></returns>
  192. private async Task<List<PermissionDto>> GetPermissionTree(string parentName, List<Permission> permissions, int roleId)
  193. {
  194. var parentPerms = permissions.Where(a => a.Parent?.Name == parentName).ToList();
  195. var list = new List<PermissionDto>();
  196. if (parentPerms.Any())
  197. {
  198. foreach (var permission in parentPerms)
  199. {
  200. var fun = await CacheManager.GetCache<string, SysFunction>(VzConsts.CacheFunction)
  201. .GetAsync(permission.Name, () => _funRepository.FirstOrDefaultAsync(a => a.PermissionName == permission.Name));
  202. var model = new PermissionDto
  203. {
  204. Name = permission.Name,
  205. IsAuth = roleId != 0 && await _roleManager.IsGrantedAsync(roleId, permission.Name),
  206. DisplayName = fun.DisplayName,
  207. Sort = fun.Sort,
  208. Icon = fun.Icon,
  209. IsOpen = fun.Depth < 2,
  210. Children = await GetPermissionTree(permission.Name, permissions, roleId)
  211. };
  212. list.Add(model);
  213. }
  214. }
  215. return list.OrderBy(a => a.Sort).ToList();
  216. }
  217. #endregion Permission
  218. }