diff --git a/framework/UPGRADE.md b/framework/UPGRADE.md index 9f39e5ad8a..ebb0902190 100644 --- a/framework/UPGRADE.md +++ b/framework/UPGRADE.md @@ -117,7 +117,7 @@ new ones save the following code as `convert.php` that should be placed in the s foreach ($oldData['items'] as $name => $data) { if (isset($data['assignments'])) { foreach ($data['assignments'] as $userId => $assignmentData) { - $assignments[$userId] = $assignmentData['roleName']; + $assignments[$userId][] = $assignmentData['roleName']; } unset($data['assignments']); } diff --git a/framework/rbac/PhpManager.php b/framework/rbac/PhpManager.php index 08a6e90a6b..3dd1a77bba 100644 --- a/framework/rbac/PhpManager.php +++ b/framework/rbac/PhpManager.php @@ -644,12 +644,14 @@ class PhpManager extends BaseManager } } - foreach ($assignments as $userId => $role) { - $this->assignments[$userId][$role] = new Assignment([ - 'userId' => $userId, - 'roleName' => $role, - 'createdAt' => $assignmentsMtime, - ]); + foreach ($assignments as $userId => $roles) { + foreach ($roles as $role) { + $this->assignments[$userId][$role] = new Assignment([ + 'userId' => $userId, + 'roleName' => $role, + 'createdAt' => $assignmentsMtime, + ]); + } } foreach ($rules as $name => $ruleData) { @@ -730,7 +732,7 @@ class PhpManager extends BaseManager foreach ($this->assignments as $userId => $assignments) { foreach ($assignments as $name => $assignment) { /* @var $assignment Assignment */ - $assignmentData[$userId] = $assignment->roleName; + $assignmentData[$userId][] = $assignment->roleName; } } $this->saveToFile($assignmentData, $this->assignmentFile); diff --git a/tests/unit/framework/rbac/DbManagerTestCase.php b/tests/unit/framework/rbac/DbManagerTestCase.php index f8795d7f86..043b86ad11 100644 --- a/tests/unit/framework/rbac/DbManagerTestCase.php +++ b/tests/unit/framework/rbac/DbManagerTestCase.php @@ -70,8 +70,7 @@ abstract class DbManagerTestCase extends ManagerTestCase protected function setUp() { parent::setUp(); - $this->auth = new DbManager(['db' => $this->getConnection()]); - + $this->auth = $this->createManager(); } protected function tearDown() @@ -105,4 +104,12 @@ abstract class DbManagerTestCase extends ManagerTestCase } return static::$db; } + + /** + * @return \yii\rbac\ManagerInterface + */ + protected function createManager() + { + return new DbManager(['db' => $this->getConnection()]); + } } diff --git a/tests/unit/framework/rbac/ManagerTestCase.php b/tests/unit/framework/rbac/ManagerTestCase.php index ec12f78646..21a49d44ee 100644 --- a/tests/unit/framework/rbac/ManagerTestCase.php +++ b/tests/unit/framework/rbac/ManagerTestCase.php @@ -17,6 +17,11 @@ abstract class ManagerTestCase extends TestCase */ protected $auth; + /** + * @return \yii\rbac\ManagerInterface + */ + abstract protected function createManager(); + public function testCreateRole() { $role = $this->auth->createRole('admin'); @@ -241,6 +246,26 @@ abstract class ManagerTestCase extends TestCase $roles = $this->auth->getRolesByUser('reader A'); $this->assertTrue(reset($roles) instanceof Role); $this->assertEquals($roles['reader']->name, 'reader'); + } + public function testAssignMultipleRoles() + { + $this->prepareData(); + + $reader = $this->auth->getRole('reader'); + $author = $this->auth->getRole('author'); + $this->auth->assign($reader, 'readingAuthor'); + $this->auth->assign($author, 'readingAuthor'); + + $this->auth = $this->createManager(); + + $roles = $this->auth->getRolesByUser('readingAuthor'); + $roleNames = []; + foreach ($roles as $role) { + $roleNames[] = $role->name; + } + + $this->assertContains('reader', $roleNames, 'Roles should contain reader. Currently it has: ' . implode(', ', $roleNames)); + $this->assertContains('author', $roleNames, 'Roles should contain author. Currently it has: ' . implode(', ', $roleNames)); } } diff --git a/tests/unit/framework/rbac/PhpManagerTest.php b/tests/unit/framework/rbac/PhpManagerTest.php index d420b7a51d..8c9c2b9554 100644 --- a/tests/unit/framework/rbac/PhpManagerTest.php +++ b/tests/unit/framework/rbac/PhpManagerTest.php @@ -32,6 +32,9 @@ class PhpManagerTest extends ManagerTestCase @unlink($this->getRuleFile()); } + /** + * @inheritdoc + */ protected function createManager() { return new ExposedPhpManager([