Issue #2390467 by iPat, adamwhite: User role permission assignments are not deleted when a role is deleted
parent
02ce89c4ed
commit
99377f95a7
|
|
@ -29,14 +29,4 @@ class RoleStorage extends ConfigEntityStorage implements RoleStorageInterface {
|
||||||
return $has_permission;
|
return $has_permission;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritdoc}
|
|
||||||
*/
|
|
||||||
public function deleteRoleReferences(array $rids) {
|
|
||||||
// Remove the role from all users.
|
|
||||||
db_delete('user__roles')
|
|
||||||
->condition('target_id', $rids)
|
|
||||||
->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,12 +27,4 @@ interface RoleStorageInterface extends ConfigEntityStorageInterface {
|
||||||
*/
|
*/
|
||||||
public function isPermissionInRoles($permission, array $rids);
|
public function isPermissionInRoles($permission, array $rids);
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete role references.
|
|
||||||
*
|
|
||||||
* @param array $rids
|
|
||||||
* The list of role IDs being deleted. The storage should
|
|
||||||
* remove permission and user references to this role.
|
|
||||||
*/
|
|
||||||
public function deleteRoleReferences(array $rids);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Contains \Drupal\user\Tests\UserRoleDeleteTest.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Drupal\user\Tests;
|
||||||
|
|
||||||
|
use Drupal\simpletest\KernelTestBase;
|
||||||
|
use Drupal\user\Entity\User;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the handling of user_role entity from the user module
|
||||||
|
*
|
||||||
|
* @group user
|
||||||
|
*/
|
||||||
|
class UserRoleDeleteTest extends KernelTestBase {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modules to enable.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
public static $modules = array('system', 'user', 'field');
|
||||||
|
|
||||||
|
protected function setUp() {
|
||||||
|
parent::setUp();
|
||||||
|
$this->installEntitySchema('user');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests removal of role references on role entity delete.
|
||||||
|
*
|
||||||
|
* @see user_user_role_delete()
|
||||||
|
*/
|
||||||
|
public function testRoleDeleteUserRoleReferenceDelete() {
|
||||||
|
// Create two test roles.
|
||||||
|
$role_storage = $this->container->get('entity.manager')->getStorage('user_role');
|
||||||
|
$role_storage->create(array('id' => 'test_role_one'))->save();
|
||||||
|
$role_storage->create(array('id' => 'test_role_two'))->save();
|
||||||
|
|
||||||
|
// Create user and assign both test roles.
|
||||||
|
$values = array(
|
||||||
|
'uid' => 1,
|
||||||
|
'roles' => array('test_role_one', 'test_role_two'),
|
||||||
|
);
|
||||||
|
$user = User::create($values);
|
||||||
|
$user->save();
|
||||||
|
|
||||||
|
// Check that user has both roles.
|
||||||
|
$this->assertTrue($user->hasRole('test_role_one'));
|
||||||
|
$this->assertTrue($user->hasRole('test_role_two'));
|
||||||
|
|
||||||
|
// Delete test role one.
|
||||||
|
$test_role_one = $role_storage->load('test_role_one');
|
||||||
|
$test_role_one->delete();
|
||||||
|
|
||||||
|
// Load user again from the database.
|
||||||
|
$user = User::load($user->id());
|
||||||
|
|
||||||
|
// Check that user does not have role one anymore, still has role two.
|
||||||
|
$this->assertFalse($user->hasRole('test_role_one'));
|
||||||
|
$this->assertTrue($user->hasRole('test_role_two'));
|
||||||
|
|
||||||
|
// Create new role with same name.
|
||||||
|
$role_storage->create(array('id' => 'test_role_one'))->save();
|
||||||
|
|
||||||
|
// Load user again from the database.
|
||||||
|
$user = User::load($user->id());
|
||||||
|
|
||||||
|
// Check that user does not have role one.
|
||||||
|
$this->assertFalse($user->hasRole('test_role_one'));
|
||||||
|
$this->assertTrue($user->hasRole('test_role_two'));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -116,4 +116,16 @@ class UserStorage extends SqlContentEntityStorage implements UserStorageInterfac
|
||||||
$this->resetCache(array($account->id()));
|
$this->resetCache(array($account->id()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function deleteRoleReferences(array $rids) {
|
||||||
|
// Remove the role from all users.
|
||||||
|
$this->database->delete('user__roles')
|
||||||
|
->condition('roles_target_id', $rids)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
$this->resetCache();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,4 +32,13 @@ interface UserStorageInterface extends EntityStorageInterface{
|
||||||
*/
|
*/
|
||||||
public function updateLastAccessTimestamp(AccountInterface $account, $timestamp);
|
public function updateLastAccessTimestamp(AccountInterface $account, $timestamp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete role references.
|
||||||
|
*
|
||||||
|
* @param array $rids
|
||||||
|
* The list of role IDs being deleted. The storage should
|
||||||
|
* remove permission and user references to this role.
|
||||||
|
*/
|
||||||
|
public function deleteRoleReferences(array $rids);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1079,6 +1079,10 @@ function user_user_role_insert(RoleInterface $role) {
|
||||||
* Implements hook_ENTITY_TYPE_delete() for user_role entities.
|
* Implements hook_ENTITY_TYPE_delete() for user_role entities.
|
||||||
*/
|
*/
|
||||||
function user_user_role_delete(RoleInterface $role) {
|
function user_user_role_delete(RoleInterface $role) {
|
||||||
|
// Delete role references for all users.
|
||||||
|
$user_storage = \Drupal::entityManager()->getStorage('user');
|
||||||
|
$user_storage->deleteRoleReferences(array($role->id()));
|
||||||
|
|
||||||
// Ignore the authenticated and anonymous roles or the role is being synced.
|
// Ignore the authenticated and anonymous roles or the role is being synced.
|
||||||
if (in_array($role->id(), array(DRUPAL_AUTHENTICATED_RID, DRUPAL_ANONYMOUS_RID)) || $role->isSyncing()) {
|
if (in_array($role->id(), array(DRUPAL_AUTHENTICATED_RID, DRUPAL_ANONYMOUS_RID)) || $role->isSyncing()) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue