1
0

PermissionService.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.Extensions.DependencyInjection;
  6. using ZhonTai.Admin.Core.Attributes;
  7. using ZhonTai.Admin.Core.Configs;
  8. using ZhonTai.Admin.Core.Dto;
  9. using ZhonTai.Admin.Services.Permission.Dto;
  10. using ZhonTai.Admin.Domain.Permission;
  11. using ZhonTai.Admin.Domain.RolePermission;
  12. using ZhonTai.Admin.Domain.TenantPermission;
  13. using ZhonTai.Admin.Domain.UserRole;
  14. using ZhonTai.Admin.Domain.PermissionApi;
  15. using ZhonTai.Admin.Domain.Role;
  16. using ZhonTai.Admin.Domain.User;
  17. using ZhonTai.DynamicApi;
  18. using ZhonTai.DynamicApi.Attributes;
  19. using ZhonTai.Admin.Core.Consts;
  20. using FreeSql;
  21. using ZhonTai.Admin.Domain.Tenant;
  22. namespace ZhonTai.Admin.Services.Permission;
  23. /// <summary>
  24. /// 权限服务
  25. /// </summary>
  26. [Order(40)]
  27. [DynamicApi(Area = AdminConsts.AreaName)]
  28. public class PermissionService : BaseService, IPermissionService, IDynamicApi
  29. {
  30. private AppConfig _appConfig => LazyGetRequiredService<AppConfig>();
  31. private IPermissionRepository _permissionRepository => LazyGetRequiredService<IPermissionRepository>();
  32. private IRoleRepository _roleRepository => LazyGetRequiredService<IRoleRepository>();
  33. private IUserRepository _userRepository => LazyGetRequiredService<IUserRepository>();
  34. private IRolePermissionRepository _rolePermissionRepository => LazyGetRequiredService<IRolePermissionRepository>();
  35. private ITenantPermissionRepository _tenantPermissionRepository => LazyGetRequiredService<ITenantPermissionRepository>();
  36. private IUserRoleRepository _userRoleRepository => LazyGetRequiredService<IUserRoleRepository>();
  37. private IPermissionApiRepository _permissionApiRepository => LazyGetRequiredService<IPermissionApiRepository>();
  38. public PermissionService()
  39. {
  40. }
  41. /// <summary>
  42. /// 清除权限下关联的用户权限缓存
  43. /// </summary>
  44. /// <param name="permissionIds"></param>
  45. /// <returns></returns>
  46. private async Task ClearUserPermissionsAsync(List<long> permissionIds)
  47. {
  48. var userIds = await _userRoleRepository.Select.Where(a =>
  49. _rolePermissionRepository
  50. .Where(b => b.RoleId == a.RoleId && permissionIds.Contains(b.PermissionId))
  51. .Any()
  52. ).ToListAsync(a => a.UserId);
  53. foreach (var userId in userIds)
  54. {
  55. await Cache.DelAsync(CacheKeys.UserPermissions + userId);
  56. }
  57. }
  58. /// <summary>
  59. /// 查询分组
  60. /// </summary>
  61. /// <param name="id"></param>
  62. /// <returns></returns>
  63. public async Task<PermissionGetGroupOutput> GetGroupAsync(long id)
  64. {
  65. var result = await _permissionRepository.GetAsync<PermissionGetGroupOutput>(id);
  66. return result;
  67. }
  68. /// <summary>
  69. /// 查询菜单
  70. /// </summary>
  71. /// <param name="id"></param>
  72. /// <returns></returns>
  73. public async Task<PermissionGetMenuOutput> GetMenuAsync(long id)
  74. {
  75. var result = await _permissionRepository.GetAsync<PermissionGetMenuOutput>(id);
  76. return result;
  77. }
  78. /// <summary>
  79. /// 查询接口
  80. /// </summary>
  81. /// <param name="id"></param>
  82. /// <returns></returns>
  83. public async Task<PermissionGetApiOutput> GetApiAsync(long id)
  84. {
  85. var result = await _permissionRepository.GetAsync<PermissionGetApiOutput>(id);
  86. return result;
  87. }
  88. /// <summary>
  89. /// 查询权限点
  90. /// </summary>
  91. /// <param name="id"></param>
  92. /// <returns></returns>
  93. public async Task<PermissionGetDotOutput> GetDotAsync(long id)
  94. {
  95. var output = await _permissionRepository.Select
  96. .WhereDynamic(id)
  97. .ToOneAsync(a => new PermissionGetDotOutput
  98. {
  99. ApiIds = _permissionApiRepository.Where(b => b.PermissionId == a.Id).OrderBy(a => a.Id).ToList(b => b.Api.Id)
  100. });
  101. return output;
  102. }
  103. /// <summary>
  104. /// 查询权限列表
  105. /// </summary>
  106. /// <param name="key"></param>
  107. /// <param name="start"></param>
  108. /// <param name="end"></param>
  109. /// <returns></returns>
  110. public async Task<List<PermissionListOutput>> GetListAsync(string key, DateTime? start, DateTime? end)
  111. {
  112. if (end.HasValue)
  113. {
  114. end = end.Value.AddDays(1);
  115. }
  116. var data = await _permissionRepository
  117. .WhereIf(key.NotNull(), a => a.Path.Contains(key) || a.Label.Contains(key))
  118. .WhereIf(start.HasValue && end.HasValue, a => a.CreatedTime.Value.BetweenEnd(start.Value, end.Value))
  119. .Include(a => a.View)
  120. .OrderBy(a => new { a.ParentId, a.Sort })
  121. .ToListAsync(a=> new PermissionListOutput
  122. {
  123. ViewPath = a.View.Path,
  124. ApiPaths = string.Join(";", _permissionApiRepository.Where(b=>b.PermissionId == a.Id).ToList(b => b.Api.Path))
  125. });
  126. return data;
  127. }
  128. /// <summary>
  129. /// 查询授权权限列表
  130. /// </summary>
  131. /// <returns></returns>
  132. public async Task<IEnumerable<dynamic>> GetPermissionList()
  133. {
  134. var permissions = await _permissionRepository.Select
  135. .WhereIf(_appConfig.Tenant && User.TenantType == TenantType.Tenant, a =>
  136. _tenantPermissionRepository
  137. .Where(b => b.PermissionId == a.Id && b.TenantId == User.TenantId)
  138. .Any()
  139. )
  140. .AsTreeCte(up: true)
  141. .ToListAsync(a => new { a.Id, a.ParentId, a.Label, a.Type, a.Sort });
  142. var menus = permissions.DistinctBy(a => a.Id).OrderBy(a => a.ParentId).ThenBy(a => a.Sort)
  143. .Select(a => new
  144. {
  145. a.Id,
  146. a.ParentId,
  147. a.Label,
  148. Row = a.Type == PermissionType.Menu
  149. });
  150. return menus;
  151. }
  152. /// <summary>
  153. /// 查询角色权限列表
  154. /// </summary>
  155. /// <param name="roleId"></param>
  156. /// <returns></returns>
  157. public async Task<List<long>> GetRolePermissionList(long roleId = 0)
  158. {
  159. var permissionIds = await _rolePermissionRepository
  160. .Select.Where(d => d.RoleId == roleId)
  161. .ToListAsync(a => a.PermissionId);
  162. return permissionIds;
  163. }
  164. /// <summary>
  165. /// 查询租户权限列表
  166. /// </summary>
  167. /// <param name="tenantId"></param>
  168. /// <returns></returns>
  169. public async Task<List<long>> GetTenantPermissionList(long tenantId)
  170. {
  171. var permissionIds = await _tenantPermissionRepository
  172. .Select.Where(d => d.TenantId == tenantId)
  173. .ToListAsync(a => a.PermissionId);
  174. return permissionIds;
  175. }
  176. /// <summary>
  177. /// 新增分组
  178. /// </summary>
  179. /// <param name="input"></param>
  180. /// <returns></returns>
  181. public async Task<long> AddGroupAsync(PermissionAddGroupInput input)
  182. {
  183. var entity = Mapper.Map<PermissionEntity>(input);
  184. entity.Type = PermissionType.Group;
  185. if (entity.Sort == 0)
  186. {
  187. var sort = await _permissionRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort);
  188. entity.Sort = sort + 1;
  189. }
  190. await _permissionRepository.InsertAsync(entity);
  191. return entity.Id;
  192. }
  193. /// <summary>
  194. /// 新增菜单
  195. /// </summary>
  196. /// <param name="input"></param>
  197. /// <returns></returns>
  198. public async Task<long> AddMenuAsync(PermissionAddMenuInput input)
  199. {
  200. var entity = Mapper.Map<PermissionEntity>(input);
  201. entity.Type = PermissionType.Menu;
  202. if (entity.Sort == 0)
  203. {
  204. var sort = await _permissionRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort);
  205. entity.Sort = sort + 1;
  206. }
  207. await _permissionRepository.InsertAsync(entity);
  208. return entity.Id;
  209. }
  210. /// <summary>
  211. /// 新增接口
  212. /// </summary>
  213. /// <param name="input"></param>
  214. /// <returns></returns>
  215. public async Task<long> AddApiAsync(PermissionAddApiInput input)
  216. {
  217. var entity = Mapper.Map<PermissionEntity>(input);
  218. entity.Type = PermissionType.Dot;
  219. if (entity.Sort == 0)
  220. {
  221. var sort = await _permissionRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort);
  222. entity.Sort = sort + 1;
  223. }
  224. await _permissionRepository.InsertAsync(entity);
  225. return entity.Id;
  226. }
  227. /// <summary>
  228. /// 新增权限点
  229. /// </summary>
  230. /// <param name="input"></param>
  231. /// <returns></returns>
  232. [AdminTransaction]
  233. public virtual async Task<long> AddDotAsync(PermissionAddDotInput input)
  234. {
  235. var entity = Mapper.Map<PermissionEntity>(input);
  236. entity.Type = PermissionType.Dot;
  237. if (entity.Sort == 0)
  238. {
  239. var sort = await _permissionRepository.Select.Where(a => a.ParentId == input.ParentId).MaxAsync(a => a.Sort);
  240. entity.Sort = sort + 1;
  241. }
  242. await _permissionRepository.InsertAsync(entity);
  243. if (input.ApiIds != null && input.ApiIds.Any())
  244. {
  245. var permissionApis = input.ApiIds.Select(a => new PermissionApiEntity { PermissionId = entity.Id, ApiId = a }).ToList();
  246. await _permissionApiRepository.InsertAsync(permissionApis);
  247. }
  248. return entity.Id;
  249. }
  250. /// <summary>
  251. /// 修改分组
  252. /// </summary>
  253. /// <param name="input"></param>
  254. /// <returns></returns>
  255. public async Task UpdateGroupAsync(PermissionUpdateGroupInput input)
  256. {
  257. var entity = await _permissionRepository.GetAsync(input.Id);
  258. entity = Mapper.Map(input, entity);
  259. await _permissionRepository.UpdateAsync(entity);
  260. }
  261. /// <summary>
  262. /// 修改菜单
  263. /// </summary>
  264. /// <param name="input"></param>
  265. /// <returns></returns>
  266. public async Task UpdateMenuAsync(PermissionUpdateMenuInput input)
  267. {
  268. var entity = await _permissionRepository.GetAsync(input.Id);
  269. entity = Mapper.Map(input, entity);
  270. await _permissionRepository.UpdateAsync(entity);
  271. }
  272. /// <summary>
  273. /// 修改接口
  274. /// </summary>
  275. /// <param name="input"></param>
  276. /// <returns></returns>
  277. public async Task UpdateApiAsync(PermissionUpdateApiInput input)
  278. {
  279. var entity = await _permissionRepository.GetAsync(input.Id);
  280. entity = Mapper.Map(input, entity);
  281. await _permissionRepository.UpdateAsync(entity);
  282. }
  283. /// <summary>
  284. /// 修改权限点
  285. /// </summary>
  286. /// <param name="input"></param>
  287. /// <returns></returns>
  288. [AdminTransaction]
  289. public virtual async Task UpdateDotAsync(PermissionUpdateDotInput input)
  290. {
  291. var entity = await _permissionRepository.GetAsync(input.Id);
  292. if (!(entity?.Id > 0))
  293. {
  294. throw ResultOutput.Exception("权限点不存在!");
  295. }
  296. Mapper.Map(input, entity);
  297. await _permissionRepository.UpdateAsync(entity);
  298. await _permissionApiRepository.DeleteAsync(a => a.PermissionId == entity.Id);
  299. if (input.ApiIds != null && input.ApiIds.Any())
  300. {
  301. var permissionApis = input.ApiIds.Select(a => new PermissionApiEntity { PermissionId = entity.Id, ApiId = a });
  302. await _permissionApiRepository.InsertAsync(permissionApis.ToList());
  303. }
  304. //清除用户权限缓存
  305. await ClearUserPermissionsAsync(new List<long> { entity.Id });
  306. }
  307. /// <summary>
  308. /// 彻底删除
  309. /// </summary>
  310. /// <param name="id"></param>
  311. /// <returns></returns>
  312. [AdminTransaction]
  313. public virtual async Task DeleteAsync(long id)
  314. {
  315. //递归查询所有权限点
  316. var ids = _permissionRepository.Select
  317. .Where(a => a.Id == id)
  318. .AsTreeCte()
  319. .ToList(a => a.Id);
  320. //删除权限关联接口
  321. await _permissionApiRepository.DeleteAsync(a => ids.Contains(a.PermissionId));
  322. //删除相关权限
  323. await _permissionRepository.DeleteAsync(a => ids.Contains(a.Id));
  324. //清除用户权限缓存
  325. await ClearUserPermissionsAsync(ids);
  326. }
  327. /// <summary>
  328. /// 删除
  329. /// </summary>
  330. /// <param name="id"></param>
  331. /// <returns></returns>
  332. public async Task SoftDeleteAsync(long id)
  333. {
  334. //递归查询所有权限点
  335. var ids = _permissionRepository.Select
  336. .Where(a => a.Id == id)
  337. .AsTreeCte()
  338. .ToList(a => a.Id);
  339. //删除权限
  340. await _permissionRepository.SoftDeleteAsync(a => ids.Contains(a.Id));
  341. //清除用户权限缓存
  342. await ClearUserPermissionsAsync(ids);
  343. }
  344. /// <summary>
  345. /// 保存角色权限
  346. /// </summary>
  347. /// <param name="input"></param>
  348. /// <returns></returns>
  349. [AdminTransaction]
  350. public virtual async Task AssignAsync(PermissionAssignInput input)
  351. {
  352. //分配权限的时候判断角色是否存在
  353. var exists = await _roleRepository.Select.DisableGlobalFilter(FilterNames.Tenant).WhereDynamic(input.RoleId).AnyAsync();
  354. if (!exists)
  355. {
  356. throw ResultOutput.Exception("该角色不存在或已被删除!");
  357. }
  358. //查询角色权限
  359. var permissionIds = await _rolePermissionRepository.Select.Where(d => d.RoleId == input.RoleId).ToListAsync(m => m.PermissionId);
  360. //批量删除权限
  361. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  362. if (deleteIds.Any())
  363. {
  364. await _rolePermissionRepository.DeleteAsync(m => m.RoleId == input.RoleId && deleteIds.Contains(m.PermissionId));
  365. }
  366. //批量插入权限
  367. var insertRolePermissions = new List<RolePermissionEntity>();
  368. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  369. //防止租户非法授权,查询主库租户权限范围
  370. if (_appConfig.Tenant && User.TenantType == TenantType.Tenant)
  371. {
  372. var cloud = ServiceProvider.GetRequiredService<FreeSqlCloud>();
  373. var tenantPermissionIds = await cloud.Use(DbKeys.AppDb).Select<TenantPermissionEntity>().Where(d => d.TenantId == User.TenantId).ToListAsync(m => m.PermissionId);
  374. insertPermissionIds = insertPermissionIds.Where(d => tenantPermissionIds.Contains(d));
  375. }
  376. if (insertPermissionIds.Any())
  377. {
  378. foreach (var permissionId in insertPermissionIds)
  379. {
  380. insertRolePermissions.Add(new RolePermissionEntity()
  381. {
  382. RoleId = input.RoleId,
  383. PermissionId = permissionId,
  384. });
  385. }
  386. await _rolePermissionRepository.InsertAsync(insertRolePermissions);
  387. }
  388. //清除角色下关联的用户权限缓存
  389. var userIds = await _userRoleRepository.Select.Where(a => a.RoleId == input.RoleId).ToListAsync(a => a.UserId);
  390. foreach (var userId in userIds)
  391. {
  392. await Cache.DelAsync(CacheKeys.UserPermissions + userId);
  393. }
  394. }
  395. /// <summary>
  396. /// 保存租户权限
  397. /// </summary>
  398. /// <param name="input"></param>
  399. /// <returns></returns>
  400. [AdminTransaction]
  401. public virtual async Task SaveTenantPermissionsAsync(PermissionSaveTenantPermissionsInput input)
  402. {
  403. //查询租户权限
  404. var permissionIds = await _tenantPermissionRepository.Select.Where(d => d.TenantId == input.TenantId).ToListAsync(m => m.PermissionId);
  405. //批量删除租户权限
  406. var deleteIds = permissionIds.Where(d => !input.PermissionIds.Contains(d));
  407. if (deleteIds.Any())
  408. {
  409. await _tenantPermissionRepository.DeleteAsync(m => m.TenantId == input.TenantId && deleteIds.Contains(m.PermissionId));
  410. //删除租户下关联的角色权限
  411. await _rolePermissionRepository.DeleteAsync(a => deleteIds.Contains(a.PermissionId));
  412. }
  413. //批量插入租户权限
  414. var tenatPermissions = new List<TenantPermissionEntity>();
  415. var insertPermissionIds = input.PermissionIds.Where(d => !permissionIds.Contains(d));
  416. if (insertPermissionIds.Any())
  417. {
  418. foreach (var permissionId in insertPermissionIds)
  419. {
  420. tenatPermissions.Add(new TenantPermissionEntity()
  421. {
  422. TenantId = input.TenantId,
  423. PermissionId = permissionId,
  424. });
  425. }
  426. await _tenantPermissionRepository.InsertAsync(tenatPermissions);
  427. }
  428. //清除租户下所有用户权限缓存
  429. var userIds = await _userRepository.Select.Where(a => a.TenantId == input.TenantId).ToListAsync(a => a.Id);
  430. if(userIds.Any())
  431. {
  432. foreach (var userId in userIds)
  433. {
  434. await Cache.DelAsync(CacheKeys.UserPermissions + userId);
  435. }
  436. }
  437. }
  438. }