DataPermissionManager.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Hotline.Caching.Interfaces;
  2. using Hotline.SeedData;
  3. using Hotline.Settings;
  4. using Hotline.Share.Enums.Settings;
  5. using Hotline.Users;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using XF.Domain.Authentications;
  8. using XF.Domain.Cache;
  9. using XF.Domain.Dependency;
  10. using XF.Domain.Entities;
  11. using XF.Domain.Exceptions;
  12. using XF.Domain.Extensions;
  13. namespace Hotline.Repository.SqlSugar.DataPermissions;
  14. public class DataPermissionManager : IDataPermissionManager, IScopeDependency
  15. {
  16. private readonly IServiceScopeFactory _serviceScopeFactory;
  17. private readonly ISessionContext _sessionContext;
  18. public DataPermissionManager(
  19. IServiceScopeFactory serviceScopeFactory,
  20. ISessionContext sessionContext
  21. )
  22. {
  23. _serviceScopeFactory = serviceScopeFactory;
  24. _sessionContext = sessionContext;
  25. }
  26. public ETableAccessLevel GetQueryFilter<TEntity>(ISessionContext sessionContext)
  27. where TEntity : class, IEntity<string>, IDataPermission, new()
  28. {
  29. return GetTopTableAccessLevel(sessionContext.Roles, typeof(TEntity).Name.ToSnakeCase());
  30. ////old
  31. //ETableAccessLevel queryFilter = GetCurrentQueryFilter(sessionContext.Roles, typeof(TEntity).Name);
  32. //return new DataPermissionScheme(queryFilter);
  33. //return queryFilter;
  34. }
  35. public (string? creatorId, string? creatorName, string? orgId, string? orgName, int orgLevel, string? areaId) GetDataPermissionOptions()
  36. {
  37. return (_sessionContext.UserId, _sessionContext.UserName,
  38. _sessionContext.OrgId, _sessionContext.OrgName,
  39. _sessionContext.OrgLevel, _sessionContext.AreaId
  40. );
  41. }
  42. // public (string orgId, string orgCode, string creatorId, string? areaId, string? creatorName, string? creatorOrgName) GetDataPermissionOptions()
  43. // {
  44. // return (_sessionContext.RequiredOrgId, _sessionContext.RequiredOrgCode,
  45. // _sessionContext.RequiredUserId, _sessionContext.OrgId,
  46. // _sessionContext.UserName, _sessionContext.OrgName);
  47. // }
  48. //private ETableAccessLevel GetCurrentQueryFilter(string[] roles, string entityName)
  49. //{
  50. // using var scope = _serviceScopeFactory.CreateScope();
  51. // var systemDataTableRepository = scope.ServiceProvider.GetRequiredService<ISystemDataTableRepository>();
  52. // var systemDataAuthorityRepository = scope.ServiceProvider.GetRequiredService<ISystemDataAuthorityRepository>();
  53. // ////查询对应表配置
  54. // var tableModel = systemDataTableRepository.GetAsync(x => x.EntityName == entityName).GetAwaiter().GetResult();
  55. // if (tableModel == null)
  56. // throw UserFriendlyException.SameMessage($"未配置表{entityName}的查询权限");
  57. // ////查询表对应最高数据权限
  58. // var auth = systemDataAuthorityRepository.GetMyTopDataAuth(roles, tableModel.Id);
  59. // return auth;
  60. //}
  61. /// <summary>
  62. /// 查询最高访问权限
  63. /// </summary>
  64. /// <param name="roles"></param>
  65. /// <param name="tableName"></param>
  66. /// <returns></returns>
  67. private ETableAccessLevel GetTopTableAccessLevel(string[] roles, string tableName)
  68. {
  69. if (roles.Contains(RoleSeedData.AdminRole))
  70. return ETableAccessLevel.All;
  71. using var scope = _serviceScopeFactory.CreateScope();
  72. var tableAccessLevelCacheManager = scope.ServiceProvider.GetService<ITableAccessLevelCacheManager>();
  73. var levels = tableAccessLevelCacheManager?.QueryAll() ?? new List<TableAccessLevelCacheItem>();
  74. var levelInRoles = levels.Where(d => roles.Contains(d.RoleCode) && d.TableName == tableName).ToList();
  75. if (!levelInRoles.Any())
  76. return ETableAccessLevel.Deny;
  77. //get top level
  78. return levelInRoles.Max(d => d.AccessLevel);
  79. }
  80. }