Browse Source

event permissions update when role update

pull/2599/head
mperk 7 years ago
parent
commit
27c565fc1e
  1. 16
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs
  2. 8
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs
  3. 2
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs
  4. 1
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj
  5. 42
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs
  6. 58
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs

16
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRole.cs

@ -100,6 +100,22 @@ namespace Volo.Abp.Identity
Claims.RemoveAll(c => c.ClaimType == claim.Type && c.ClaimValue == claim.Value);
}
public virtual void ChangeName(string name)
{
Check.NotNullOrWhiteSpace(name, nameof(name));
var oldName = Name;
Name = name;
AddLocalEvent(
new IdentityRoleNameChangedEvent
{
IdentityRole = this,
OldName = oldName
}
);
}
public override string ToString()
{
return $"{base.ToString()}, Name = {Name}";

8
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleNameChangedEvent.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.Identity
{
public class IdentityRoleNameChangedEvent
{
public IdentityRole IdentityRole { get; set; }
public string OldName { get; set; }
}
}

2
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs

@ -165,7 +165,7 @@ namespace Volo.Abp.Identity
Check.NotNull(role, nameof(role));
role.Name = roleName;
role.ChangeName(roleName);
return Task.CompletedTask;
}

1
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj

@ -16,6 +16,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\permission-management\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
<ProjectReference Include="..\Volo.Abp.Identity.Domain\Volo.Abp.Identity.Domain.csproj" />
</ItemGroup>
</Project>

42
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleUpdateEventHandler.cs

@ -0,0 +1,42 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.Identity;
namespace Volo.Abp.PermissionManagement.Identity
{
public class RoleUpdateEventHandler :
ILocalEventHandler<IdentityRoleNameChangedEvent>,
ITransientDependency
{
protected IIdentityRoleRepository RoleRepository { get; }
protected IPermissionManager PermissionManager { get; }
protected IPermissionGrantRepository PermissionGrantRepository { get; }
public RoleUpdateEventHandler(
IIdentityRoleRepository roleRepository,
IPermissionManager permissionManager,
IPermissionGrantRepository permissionGrantRepository)
{
RoleRepository = roleRepository;
PermissionManager = permissionManager;
PermissionGrantRepository = permissionGrantRepository;
}
public async Task HandleEventAsync(IdentityRoleNameChangedEvent eventData)
{
var role = await RoleRepository.FindAsync(eventData.IdentityRole.Id, false).ConfigureAwait(false);
if (role == null)
{
return;
}
var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", eventData.OldName).ConfigureAwait(false);
foreach (var permissionGrant in permissionGrantsInRole)
{
await PermissionManager.UpdateProviderKeyAsync(permissionGrant, eventData.IdentityRole.Name).ConfigureAwait(false);
}
}
}
}

58
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/RoleChangingEvents_Test.cs

@ -0,0 +1,58 @@
using Microsoft.AspNetCore.Identity;
using Shouldly;
using System.Threading.Tasks;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Guids;
using Volo.Abp.PermissionManagement;
using Volo.Abp.Uow;
using Xunit;
namespace Volo.Abp.Identity
{
public class RoleChangingEvents_Test : AbpIdentityDomainTestBase
{
protected readonly IIdentityRoleRepository RoleRepository;
protected readonly IPermissionGrantRepository PermissionGrantRepository;
protected readonly IdentityRoleManager RoleManager;
protected readonly ILookupNormalizer LookupNormalizer;
protected readonly IGuidGenerator GuidGenerator;
protected readonly IUnitOfWorkManager UowManager;
public RoleChangingEvents_Test()
{
RoleRepository = GetRequiredService<IIdentityRoleRepository>(); ;
PermissionGrantRepository = GetRequiredService<IPermissionGrantRepository>(); ;
RoleManager = GetRequiredService<IdentityRoleManager>(); ;
LookupNormalizer = GetRequiredService<ILookupNormalizer>(); ;
GuidGenerator = GetRequiredService<IGuidGenerator>();
UowManager = GetRequiredService<IUnitOfWorkManager>();
}
[Fact]
public async Task Role_Update_Event_Test()
{
var role = await RoleRepository
.FindByNormalizedNameAsync(LookupNormalizer.NormalizeName("moderator"))
.ConfigureAwait(false);
var permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", role.Name).ConfigureAwait(false);
permissionGrantsInRole.ShouldNotBeNull();
permissionGrantsInRole.Count.ShouldBeGreaterThan(0);
var count = permissionGrantsInRole.Count;
using (var uow = UowManager.Begin())
{
var identityResult = await RoleManager.SetRoleNameAsync(role, "TestModerator").ConfigureAwait(false);
identityResult.Succeeded.ShouldBeTrue();
var xx = await RoleRepository.UpdateAsync(role).ConfigureAwait(false);
await uow.CompleteAsync().ConfigureAwait(false);
}
role = await RoleRepository.GetAsync(role.Id).ConfigureAwait(false);
role.Name.ShouldBe("TestModerator");
permissionGrantsInRole = await PermissionGrantRepository.GetListAsync("R", role.Name).ConfigureAwait(false);
permissionGrantsInRole.Count.ShouldBe(count);
}
}
}
Loading…
Cancel
Save