VzRoleManager.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. #nullable enable
  2. using Abp;
  3. using Abp.Application.Features;
  4. using Abp.Authorization;
  5. using Abp.Collections.Extensions;
  6. using Abp.Domain.Repositories;
  7. using Abp.Domain.Services;
  8. using Abp.Domain.Uow;
  9. using Abp.Localization;
  10. using Abp.Runtime.Caching;
  11. using Abp.UI;
  12. using Microsoft.AspNetCore.Identity;
  13. using System.Globalization;
  14. using VberZero.BaseSystem.Organizations;
  15. using VberZero.BaseSystem.Roles;
  16. using VberZero.Caching;
  17. using VberZero.Configuration;
  18. using VberZero.Session;
  19. namespace VberZero.Authorization.Roles;
  20. public class VzRoleManager : RoleManager<Role>, IDomainService
  21. {
  22. public ILocalizationManager LocalizationManager { get; set; }
  23. protected string LocalizationSourceName { get; set; }
  24. public IVzSession AbpSession { get; set; }
  25. public IRoleManagementConfig RoleManagementConfig { get; }
  26. public FeatureDependencyContext FeatureDependencyContext { get; set; }
  27. private IRolePermissionStore<Role> RolePermissionStore
  28. {
  29. get
  30. {
  31. if (!(Store is IRolePermissionStore<Role>))
  32. {
  33. throw new AbpException("Store is not IRolePermissionStore");
  34. }
  35. return Store as IRolePermissionStore<Role> ?? throw new InvalidOperationException();
  36. }
  37. }
  38. protected VzRoleStore AbpStore { get; }
  39. private readonly IPermissionManager _permissionManager;
  40. private readonly ICacheManager _cacheManager;
  41. private readonly IUnitOfWorkManager _unitOfWorkManager;
  42. private readonly IRepository<OrganizationUnit, long> _organizationUnitRepository;
  43. private readonly IRepository<OrganizationUnitRole, long> _organizationUniRoleRepository;
  44. public VzRoleManager(
  45. VzRoleStore store,
  46. IEnumerable<IRoleValidator<Role>> roleValidators,
  47. ILookupNormalizer keyNormalizer,
  48. IdentityErrorDescriber errors,
  49. ILogger<VzRoleManager> logger,
  50. IPermissionManager permissionManager,
  51. ICacheManager cacheManager,
  52. IUnitOfWorkManager unitOfWorkManager,
  53. IRoleManagementConfig roleManagementConfig,
  54. IRepository<OrganizationUnit, long> organizationUnitRepository,
  55. IRepository<OrganizationUnitRole, long> organizationUniRoleRepository)
  56. : base(
  57. store,
  58. roleValidators,
  59. keyNormalizer,
  60. errors,
  61. logger)
  62. {
  63. _permissionManager = permissionManager;
  64. _cacheManager = cacheManager;
  65. _unitOfWorkManager = unitOfWorkManager;
  66. RoleManagementConfig = roleManagementConfig;
  67. _organizationUnitRepository = organizationUnitRepository;
  68. _organizationUniRoleRepository = organizationUniRoleRepository;
  69. AbpStore = store;
  70. AbpSession = NullVzSession.Instance;
  71. LocalizationManager = NullLocalizationManager.Instance;
  72. LocalizationSourceName = VzConsts.LocalizationSourceName;
  73. }
  74. #region Permission
  75. #region IsGranted
  76. /// <summary>
  77. /// 检查角色是否被授予权限
  78. /// </summary>
  79. /// <param name="roleName"></param>
  80. /// <param name="permissionName"></param>
  81. /// <returns></returns>
  82. public virtual async Task<bool> IsGrantedAsync(string roleName, string permissionName)
  83. {
  84. return await IsGrantedAsync((await GetRoleByNameAsync(roleName)).Id,
  85. _permissionManager.GetPermission(permissionName));
  86. }
  87. /// <summary>
  88. /// 检查角色是否被授予权限
  89. /// </summary>
  90. /// <param name="roleId"></param>
  91. /// <param name="permissionName"></param>
  92. /// <returns></returns>
  93. public virtual async Task<bool> IsGrantedAsync(int roleId, string permissionName)
  94. {
  95. return await IsGrantedAsync(roleId, _permissionManager.GetPermission(permissionName));
  96. }
  97. /// <summary>
  98. /// 检查角色是否被授予权限
  99. /// </summary>
  100. /// <param name="role"></param>
  101. /// <param name="permission"></param>
  102. /// <returns></returns>
  103. public Task<bool> IsGrantedAsync(Role role, Permission permission)
  104. {
  105. return IsGrantedAsync(role.Id, permission);
  106. }
  107. /// <summary>
  108. /// 检查角色是否被授予权限
  109. /// </summary>
  110. /// <param name="roleId"></param>
  111. /// <param name="permission"></param>
  112. /// <returns></returns>
  113. public virtual async Task<bool> IsGrantedAsync(int roleId, Permission permission)
  114. {
  115. //获取缓存的角色权限
  116. var cacheItem = await GetRolePermissionCacheItemAsync(roleId);
  117. //检查权限
  118. return cacheItem.GrantedPermissions.Contains(permission.Name);
  119. }
  120. /// <summary>
  121. /// 检查角色是否被授予权限
  122. /// </summary>
  123. /// <param name="roleId"></param>
  124. /// <param name="permission"></param>
  125. /// <returns></returns>
  126. public virtual bool IsGranted(int roleId, Permission permission)
  127. {
  128. //获取缓存的角色权限
  129. var cacheItem = GetRolePermissionCacheItem(roleId);
  130. //检查权限
  131. return cacheItem.GrantedPermissions.Contains(permission.Name);
  132. }
  133. #endregion IsGranted
  134. /// <summary>
  135. /// 获取角色的权限
  136. /// </summary>
  137. /// <param name="roleId"></param>
  138. /// <returns></returns>
  139. public virtual async Task<IReadOnlyList<Permission>> GetGrantedPermissionsAsync(int roleId)
  140. {
  141. return await GetGrantedPermissionsAsync(await GetRoleByIdAsync(roleId));
  142. }
  143. /// <summary>
  144. /// 获取角色的权限
  145. /// </summary>
  146. /// <param name="roleName"></param>
  147. /// <returns></returns>
  148. public virtual async Task<IReadOnlyList<Permission>> GetGrantedPermissionsAsync(string roleName)
  149. {
  150. return await GetGrantedPermissionsAsync(await GetRoleByNameAsync(roleName));
  151. }
  152. /// <summary>
  153. /// 获取角色的权限
  154. /// </summary>
  155. /// <param name="role"></param>
  156. /// <returns></returns>
  157. public virtual async Task<IReadOnlyList<Permission>> GetGrantedPermissionsAsync(Role role)
  158. {
  159. var cacheItem = await GetRolePermissionCacheItemAsync(role.Id);
  160. var allPermissions = _permissionManager.GetAllPermissions();
  161. return allPermissions.Where(x => cacheItem.GrantedPermissions.Contains(x.Name)).ToList();
  162. }
  163. /// <summary>
  164. /// 一次设置角色的所有授予权限。
  165. /// 禁止所有其他权限
  166. /// </summary>
  167. /// <param name="roleId"></param>
  168. /// <param name="permissions"></param>
  169. /// <param name="isRemove">true 移除所有其他权限 false禁止所有其他权限</param>
  170. public virtual async Task SetGrantedPermissionsAsync(int roleId, IEnumerable<Permission> permissions, bool isRemove = true)
  171. {
  172. await SetGrantedPermissionsAsync(await GetRoleByIdAsync(roleId), permissions);
  173. }
  174. /// <summary>
  175. /// 一次设置角色的所有授予权限。
  176. /// 禁止所有其他权限。
  177. /// </summary>
  178. /// <param name="role"></param>
  179. /// <param name="permissions"></param>
  180. /// <param name="isRemove">true 移除所有其他权限 false禁止所有其他权限</param>
  181. public virtual async Task SetGrantedPermissionsAsync(Role role, IEnumerable<Permission> permissions, bool isRemove = true)
  182. {
  183. var oldPermissions = await GetGrantedPermissionsAsync(role);
  184. var newPermissions = permissions.ToArray();
  185. foreach (var permission in oldPermissions.Where(p =>
  186. !newPermissions.Contains(p, PermissionEqualityComparer.Instance)))
  187. {
  188. if (isRemove)
  189. {
  190. await RemovePermissionAsync(role, permission);
  191. }
  192. else
  193. {
  194. await ProhibitPermissionAsync(role, permission);
  195. }
  196. }
  197. foreach (var permission in newPermissions.Where(p =>
  198. !oldPermissions.Contains(p, PermissionEqualityComparer.Instance)))
  199. {
  200. await GrantPermissionAsync(role, permission);
  201. }
  202. }
  203. /// <summary>
  204. /// 授予角色权限
  205. /// </summary>
  206. /// <param name="role"></param>
  207. /// <param name="permission"></param>
  208. public async Task GrantPermissionAsync(Role role, Permission permission)
  209. {
  210. if (await IsGrantedAsync(role.Id, permission))
  211. {
  212. return;
  213. }
  214. await RolePermissionStore.RemovePermissionAsync(role, new PermissionGrantInfo(permission.Name, false));
  215. await RolePermissionStore.AddPermissionAsync(role, new PermissionGrantInfo(permission.Name, true));
  216. }
  217. /// <summary>
  218. /// 移除角色权限
  219. /// </summary>
  220. /// <param name="role"></param>
  221. /// <param name="permission"></param>
  222. public async Task RemovePermissionAsync(Role role, Permission permission)
  223. {
  224. if (!await IsGrantedAsync(role.Id, permission))
  225. {
  226. return;
  227. }
  228. await RolePermissionStore.RemovePermissionAsync(role, new PermissionGrantInfo(permission.Name, true));
  229. }
  230. /// <summary>
  231. /// 禁止角色权限
  232. /// </summary>
  233. /// <param name="role"></param>
  234. /// <param name="permission"></param>
  235. public async Task ProhibitPermissionAsync(Role role, Permission permission)
  236. {
  237. if (!await IsGrantedAsync(role.Id, permission))
  238. {
  239. return;
  240. }
  241. await RolePermissionStore.RemovePermissionAsync(role, new PermissionGrantInfo(permission.Name, true));
  242. await RolePermissionStore.AddPermissionAsync(role, new PermissionGrantInfo(permission.Name, false));
  243. }
  244. /// <summary>
  245. /// 禁止角色的所有权限
  246. /// </summary>
  247. /// <param name="role">Role</param>
  248. public async Task ProhibitAllPermissionsAsync(Role role)
  249. {
  250. foreach (var permission in _permissionManager.GetAllPermissions())
  251. {
  252. await ProhibitPermissionAsync(role, permission);
  253. }
  254. }
  255. /// <summary>
  256. /// 重置角色的所有权限设置。删除角色的所有权限设置。
  257. /// 角色将拥有 <see cref="StaticRoleDefinition.IsGrantedByDefault"/> 返回 true 的权限
  258. /// </summary>
  259. /// <param name="role"></param>
  260. public async Task ResetAllPermissionsAsync(Role role)
  261. {
  262. await RolePermissionStore.RemoveAllPermissionSettingsAsync(role);
  263. }
  264. #endregion Permission
  265. /// <summary>
  266. /// 创建角色
  267. /// </summary>
  268. /// <param name="role"></param>
  269. public override async Task<IdentityResult> CreateAsync(Role role)
  270. {
  271. var result = await CheckDuplicateRoleNameAsync(role.Id, role.Name, role.DisplayName);
  272. if (!result.Succeeded)
  273. {
  274. return result;
  275. }
  276. var tenantId = GetCurrentTenantId();
  277. if (tenantId.HasValue && !role.TenantId.HasValue)
  278. {
  279. role.TenantId = tenantId.Value;
  280. }
  281. return await base.CreateAsync(role);
  282. }
  283. /// <summary>
  284. /// 修改角色
  285. /// </summary>
  286. /// <param name="role"></param>
  287. /// <returns></returns>
  288. public override async Task<IdentityResult> UpdateAsync(Role role)
  289. {
  290. var result = await CheckDuplicateRoleNameAsync(role.Id, role.Name, role.DisplayName);
  291. if (!result.Succeeded)
  292. {
  293. return result;
  294. }
  295. return await base.UpdateAsync(role);
  296. }
  297. /// <summary>
  298. /// 删除角色
  299. /// </summary>
  300. /// <param name="role">Role</param>
  301. public override async Task<IdentityResult> DeleteAsync(Role role)
  302. {
  303. if (role.IsStatic)
  304. {
  305. throw new UserFriendlyException(string.Format(L("CanNotDeleteStaticRole"), role.Name));
  306. }
  307. return await base.DeleteAsync(role);
  308. }
  309. /// <summary>
  310. /// 通过给定的 id 获取角色。
  311. /// 如果没有给定 id 的角色,则抛出异常。
  312. /// </summary>
  313. /// <param name="roleId"></param>
  314. /// <returns>Role</returns>
  315. public virtual async Task<Role> GetRoleByIdAsync(int roleId)
  316. {
  317. var role = await FindByIdAsync(roleId.ToString());
  318. if (role == null)
  319. {
  320. throw new AbpException("There is no role with id: " + roleId);
  321. }
  322. return role;
  323. }
  324. /// <summary>
  325. /// 通过给定的 roleName 获取角色。
  326. /// 如果没有给定 roleName 的角色,则抛出异常。
  327. /// </summary>
  328. /// <param name="roleName"></param>
  329. /// <returns>Role</returns>
  330. public virtual async Task<Role> GetRoleByNameAsync(string roleName)
  331. {
  332. var role = await FindByNameAsync(roleName);
  333. if (role == null)
  334. {
  335. throw new AbpException("There is no role with name: " + roleName);
  336. }
  337. return role;
  338. }
  339. /// <summary>
  340. /// 通过给定的 roleName 获取角色。
  341. /// 如果没有给定 roleName 的角色,则抛出异常。
  342. /// </summary>
  343. /// <param name="roleName"></param>
  344. /// <returns>Role</returns>
  345. public virtual Role GetRoleByName(string roleName)
  346. {
  347. var normalizedRoleName = roleName.ToUpperInvariant();
  348. var role = AbpStore.FindByName(normalizedRoleName);
  349. if (role == null)
  350. {
  351. throw new AbpException("There is no role with name: " + roleName);
  352. }
  353. return role;
  354. }
  355. public async Task GrantAllPermissionsAsync(Role role)
  356. {
  357. FeatureDependencyContext.TenantId = role.TenantId;
  358. var permissions = _permissionManager.GetAllPermissions(Abp.MultiTenancy.MultiTenancyExtensions.GetMultiTenancySide(role))
  359. .Where(permission =>
  360. permission.FeatureDependency == null ||
  361. permission.FeatureDependency.IsSatisfied(FeatureDependencyContext)
  362. );
  363. await SetGrantedPermissionsAsync(role, permissions);
  364. }
  365. public virtual async Task<IdentityResult> CreateStaticRoles(int tenantId)
  366. {
  367. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  368. {
  369. var staticRoleDefinitions = RoleManagementConfig.StaticRoles.Where(
  370. sr => sr.Side == Abp.MultiTenancy.MultiTenancySides.Tenant
  371. );
  372. using (_unitOfWorkManager.Current.SetTenantId(tenantId))
  373. {
  374. foreach (var staticRoleDefinition in staticRoleDefinitions)
  375. {
  376. var role = MapStaticRoleDefinitionToRole(tenantId, staticRoleDefinition);
  377. var identityResult = await CreateAsync(role);
  378. if (!identityResult.Succeeded)
  379. {
  380. return identityResult;
  381. }
  382. }
  383. }
  384. return IdentityResult.Success;
  385. });
  386. }
  387. public virtual async Task<IdentityResult> CheckDuplicateRoleNameAsync(
  388. int? expectedRoleId,
  389. string name,
  390. string displayName)
  391. {
  392. var role = await FindByNameAsync(name);
  393. if (role != null && role.Id != expectedRoleId)
  394. {
  395. throw new UserFriendlyException(string.Format(L("RoleNameIsAlreadyTaken"), name));
  396. }
  397. role = await FindByDisplayNameAsync(displayName);
  398. if (role != null && role.Id != expectedRoleId)
  399. {
  400. throw new UserFriendlyException(string.Format(L("RoleDisplayNameIsAlreadyTaken"), displayName));
  401. }
  402. return IdentityResult.Success;
  403. }
  404. /// <summary>
  405. /// 获取组织单元的角色
  406. /// </summary>
  407. /// <param name="organizationUnit"></param>
  408. /// <param name="includeChildren">包括子组织单位的角色。 默认为 false</param>
  409. /// <returns></returns>
  410. public virtual async Task<List<Role>> GetRolesInOrganizationUnit(
  411. OrganizationUnit organizationUnit,
  412. bool includeChildren = false)
  413. {
  414. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  415. {
  416. if (!includeChildren)
  417. {
  418. var query = from organizationUniRole in _organizationUniRoleRepository.GetAll()
  419. join role in Roles on organizationUniRole.RoleId equals role.Id
  420. where organizationUniRole.OrganizationUnitId == organizationUnit.Id
  421. select role;
  422. return query.ToList();
  423. }
  424. else
  425. {
  426. var query = from organizationUniRole in _organizationUniRoleRepository.GetAll()
  427. join role in Roles on organizationUniRole.RoleId equals role.Id
  428. join ou in _organizationUnitRepository.GetAll() on organizationUniRole.OrganizationUnitId
  429. equals
  430. ou.Id
  431. where ou.Path.StartsWith(organizationUnit.Path)
  432. select role;
  433. return query.ToList();
  434. }
  435. });
  436. return await Task.FromResult(result);
  437. }
  438. public virtual async Task SetOrganizationUnitsAsync(int roleId, params long[]? organizationUnitIds)
  439. {
  440. await SetOrganizationUnitsAsync(
  441. await GetRoleByIdAsync(roleId),
  442. organizationUnitIds
  443. );
  444. }
  445. public virtual async Task SetOrganizationUnitsAsync(Role role, params long[]? organizationUnitIds)
  446. {
  447. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  448. {
  449. organizationUnitIds ??= Array.Empty<long>();
  450. var currentOus = await GetOrganizationUnitsAsync(role);
  451. //Remove from removed OUs
  452. foreach (var currentOu in currentOus)
  453. {
  454. if (!organizationUnitIds.Contains(currentOu.Id))
  455. {
  456. await RemoveFromOrganizationUnitAsync(role, currentOu);
  457. }
  458. }
  459. //Add to added OUs
  460. foreach (var organizationUnitId in organizationUnitIds)
  461. {
  462. if (currentOus.All(ou => ou.Id != organizationUnitId))
  463. {
  464. await AddToOrganizationUnitAsync(
  465. role,
  466. await _organizationUnitRepository.GetAsync(organizationUnitId)
  467. );
  468. }
  469. }
  470. });
  471. }
  472. public virtual async Task<bool> IsInOrganizationUnitAsync(int roleId, long ouId)
  473. {
  474. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  475. await IsInOrganizationUnitAsync(
  476. await GetRoleByIdAsync(roleId),
  477. await _organizationUnitRepository.GetAsync(ouId)
  478. )
  479. );
  480. }
  481. public virtual async Task<bool> IsInOrganizationUnitAsync(Role role, OrganizationUnit ou)
  482. {
  483. return await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  484. {
  485. return await _organizationUniRoleRepository.CountAsync(uou =>
  486. uou.RoleId == role.Id && uou.OrganizationUnitId == ou.Id
  487. ) > 0;
  488. });
  489. }
  490. public virtual async Task AddToOrganizationUnitAsync(int roleId, long ouId, int? tenantId)
  491. {
  492. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  493. {
  494. await AddToOrganizationUnitAsync(
  495. await GetRoleByIdAsync(roleId),
  496. await _organizationUnitRepository.GetAsync(ouId)
  497. );
  498. });
  499. }
  500. public virtual async Task AddToOrganizationUnitAsync(Role role, OrganizationUnit ou)
  501. {
  502. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  503. {
  504. if (await IsInOrganizationUnitAsync(role, ou))
  505. {
  506. return;
  507. }
  508. await _organizationUniRoleRepository.InsertAsync(new OrganizationUnitRole(role.TenantId, role.Id, ou.Id));
  509. });
  510. }
  511. public async Task RemoveFromOrganizationUnitAsync(int roleId, long organizationUnitId)
  512. {
  513. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  514. {
  515. await RemoveFromOrganizationUnitAsync(
  516. await GetRoleByIdAsync(roleId),
  517. await _organizationUnitRepository.GetAsync(organizationUnitId)
  518. );
  519. });
  520. }
  521. public virtual async Task RemoveFromOrganizationUnitAsync(Role role, OrganizationUnit ou)
  522. {
  523. await _unitOfWorkManager.WithUnitOfWorkAsync(async () =>
  524. {
  525. await _organizationUniRoleRepository.DeleteAsync(uor =>
  526. uor.RoleId == role.Id && uor.OrganizationUnitId == ou.Id
  527. );
  528. });
  529. }
  530. public virtual async Task<List<OrganizationUnit>> GetOrganizationUnitsAsync(Role role)
  531. {
  532. var result = _unitOfWorkManager.WithUnitOfWork(() =>
  533. {
  534. var query = from uor in _organizationUniRoleRepository.GetAll()
  535. join ou in _organizationUnitRepository.GetAll() on uor.OrganizationUnitId equals ou.Id
  536. where uor.RoleId == role.Id
  537. select ou;
  538. return query.ToList();
  539. });
  540. return await Task.FromResult(result);
  541. }
  542. private Task<Role> FindByDisplayNameAsync(string displayName)
  543. {
  544. return AbpStore.FindByDisplayNameAsync(displayName);
  545. }
  546. private async Task<RolePermissionCacheItem> GetRolePermissionCacheItemAsync(int roleId)
  547. {
  548. var cacheKey = roleId + "@" + (GetCurrentTenantId() ?? 0);
  549. return await _cacheManager.GetRolePermissionCache().GetAsync(cacheKey, async () =>
  550. {
  551. var newCacheItem = new RolePermissionCacheItem(roleId);
  552. var role = await Store.FindByIdAsync(roleId.ToString(), CancellationToken);
  553. if (role == null)
  554. {
  555. throw new AbpException("There is no role with given id: " + roleId);
  556. }
  557. var staticRoleDefinition = RoleManagementConfig.StaticRoles.FirstOrDefault(r =>
  558. r.RoleName == role.Name && r.Side == Abp.MultiTenancy.MultiTenancyExtensions.GetMultiTenancySide(role)
  559. );
  560. if (staticRoleDefinition != null)
  561. {
  562. foreach (var permission in _permissionManager.GetAllPermissions())
  563. {
  564. if (staticRoleDefinition.IsGrantedByDefault(permission))
  565. {
  566. newCacheItem.GrantedPermissions.Add(permission.Name);
  567. }
  568. }
  569. }
  570. foreach (var permissionInfo in await RolePermissionStore.GetPermissionsAsync(roleId))
  571. {
  572. if (permissionInfo.IsGranted)
  573. {
  574. newCacheItem.GrantedPermissions.AddIfNotContains(permissionInfo.Name);
  575. }
  576. else
  577. {
  578. newCacheItem.GrantedPermissions.Remove(permissionInfo.Name);
  579. }
  580. }
  581. return newCacheItem;
  582. });
  583. }
  584. private RolePermissionCacheItem GetRolePermissionCacheItem(int roleId)
  585. {
  586. var cacheKey = roleId + "@" + (GetCurrentTenantId() ?? 0);
  587. return _cacheManager.GetRolePermissionCache().Get(cacheKey, () =>
  588. {
  589. var newCacheItem = new RolePermissionCacheItem(roleId);
  590. var role = AbpStore.FindById(roleId.ToString(), CancellationToken);
  591. if (role == null)
  592. {
  593. throw new AbpException("There is no role with given id: " + roleId);
  594. }
  595. var staticRoleDefinition = RoleManagementConfig.StaticRoles.FirstOrDefault(r =>
  596. r.RoleName == role.Name && r.Side == Abp.MultiTenancy.MultiTenancyExtensions.GetMultiTenancySide(role)
  597. );
  598. if (staticRoleDefinition != null)
  599. {
  600. foreach (var permission in _permissionManager.GetAllPermissions())
  601. {
  602. if (staticRoleDefinition.IsGrantedByDefault(permission))
  603. {
  604. newCacheItem.GrantedPermissions.Add(permission.Name);
  605. }
  606. }
  607. }
  608. foreach (var permissionInfo in RolePermissionStore.GetPermissions(roleId))
  609. {
  610. if (permissionInfo.IsGranted)
  611. {
  612. newCacheItem.GrantedPermissions.AddIfNotContains(permissionInfo.Name);
  613. }
  614. else
  615. {
  616. newCacheItem.GrantedPermissions.Remove(permissionInfo.Name);
  617. }
  618. }
  619. return newCacheItem;
  620. });
  621. }
  622. protected virtual string L(string name)
  623. {
  624. return LocalizationManager.GetString(LocalizationSourceName, name);
  625. }
  626. protected virtual string L(string name, CultureInfo cultureInfo)
  627. {
  628. return LocalizationManager.GetString(LocalizationSourceName, name, cultureInfo);
  629. }
  630. protected virtual Role MapStaticRoleDefinitionToRole(int tenantId, StaticRoleDefinition staticRoleDefinition)
  631. {
  632. return new Role
  633. {
  634. TenantId = tenantId,
  635. Name = staticRoleDefinition.RoleName,
  636. DisplayName = staticRoleDefinition.RoleDisplayName,
  637. IsStatic = true
  638. };
  639. }
  640. private int? GetCurrentTenantId()
  641. {
  642. if (_unitOfWorkManager.Current != null)
  643. {
  644. return _unitOfWorkManager.Current.GetTenantId();
  645. }
  646. return AbpSession.TenantId;
  647. }
  648. }