event permissions update when role update

pull/2599/head
mperk 6 years ago
parent 9aece8dc42
commit 27c565fc1e

@ -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}";

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

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

@ -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>

@ -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);
}
}
}
}

@ -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