PermissionManager.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System.Collections.Generic;
  2. using System.Collections.Immutable;
  3. using System.Linq;
  4. using Abp.Application.Features;
  5. using Abp.Collections.Extensions;
  6. using Abp.Configuration.Startup;
  7. using Abp.Dependency;
  8. using Abp.MultiTenancy;
  9. using Abp.Runtime.Session;
  10. namespace Abp.Authorization
  11. {
  12. /// <summary>
  13. /// Permission manager.
  14. /// </summary>
  15. internal class PermissionManager : PermissionDefinitionContextBase, IPermissionManager, ISingletonDependency
  16. {
  17. public IAbpSession AbpSession { get; set; }
  18. private readonly IIocManager _iocManager;
  19. private readonly IAuthorizationConfiguration _authorizationConfiguration;
  20. /// <summary>
  21. /// Constructor.
  22. /// </summary>
  23. public PermissionManager(
  24. IIocManager iocManager,
  25. IAuthorizationConfiguration authorizationConfiguration)
  26. {
  27. _iocManager = iocManager;
  28. _authorizationConfiguration = authorizationConfiguration;
  29. AbpSession = NullAbpSession.Instance;
  30. }
  31. public void Initialize()
  32. {
  33. foreach (var providerType in _authorizationConfiguration.Providers)
  34. {
  35. using (var provider = _iocManager.ResolveAsDisposable<AuthorizationProvider>(providerType))
  36. {
  37. provider.Object.SetPermissions(this);
  38. }
  39. }
  40. Permissions.AddAllPermissions();
  41. }
  42. public Permission GetPermission(string name)
  43. {
  44. var permission = Permissions.GetOrDefault(name);
  45. if (permission == null)
  46. {
  47. throw new AbpException("There is no permission with name: " + name);
  48. }
  49. return permission;
  50. }
  51. public IReadOnlyList<Permission> GetAllPermissions(bool tenancyFilter = true)
  52. {
  53. using (var featureDependencyContext = _iocManager.ResolveAsDisposable<FeatureDependencyContext>())
  54. {
  55. var featureDependencyContextObject = featureDependencyContext.Object;
  56. return Permissions.Values
  57. .WhereIf(tenancyFilter, p => p.MultiTenancySides.HasFlag(AbpSession.MultiTenancySide))
  58. .Where(p =>
  59. p.FeatureDependency == null ||
  60. AbpSession.MultiTenancySide == MultiTenancySides.Host ||
  61. p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
  62. ).ToImmutableList();
  63. }
  64. }
  65. public IReadOnlyList<Permission> GetAllPermissions(MultiTenancySides multiTenancySides)
  66. {
  67. using (var featureDependencyContext = _iocManager.ResolveAsDisposable<FeatureDependencyContext>())
  68. {
  69. var featureDependencyContextObject = featureDependencyContext.Object;
  70. return Permissions.Values
  71. .Where(p => p.MultiTenancySides.HasFlag(multiTenancySides))
  72. .Where(p =>
  73. p.FeatureDependency == null ||
  74. AbpSession.MultiTenancySide == MultiTenancySides.Host ||
  75. (p.MultiTenancySides.HasFlag(MultiTenancySides.Host) &&
  76. multiTenancySides.HasFlag(MultiTenancySides.Host)) ||
  77. p.FeatureDependency.IsSatisfied(featureDependencyContextObject)
  78. ).ToImmutableList();
  79. }
  80. }
  81. }
  82. }