diff --git a/framework/yii/rbac/DbManager.php b/framework/yii/rbac/DbManager.php index 5bbc7ab..e9e1730 100644 --- a/framework/yii/rbac/DbManager.php +++ b/framework/yii/rbac/DbManager.php @@ -277,6 +277,18 @@ class DbManager extends Manager } /** + * Revokes all authorization assignments from a user. + * @param mixed $userId the user ID (see [[User::id]]) + * @return boolean whether removal is successful + */ + public function revokeAll($userId) + { + return $this->db->createCommand() + ->delete($this->assignmentTable, ['user_id' => $userId]) + ->execute() > 0; + } + + /** * Returns a value indicating whether the item has been assigned to the user. * @param mixed $userId the user ID (see [[User::id]]) * @param string $itemName the item name diff --git a/framework/yii/rbac/Manager.php b/framework/yii/rbac/Manager.php index 1710a77..a1bf47a 100644 --- a/framework/yii/rbac/Manager.php +++ b/framework/yii/rbac/Manager.php @@ -269,6 +269,12 @@ abstract class Manager extends Component */ abstract public function revoke($userId, $itemName); /** + * Revokes all authorization assignments from a user. + * @param mixed $userId the user ID (see [[User::id]]) + * @return boolean whether removal is successful + */ + abstract public function revokeAll($userId); + /** * Returns a value indicating whether the item has been assigned to the user. * @param mixed $userId the user ID (see [[User::id]]) * @param string $itemName the item name diff --git a/framework/yii/rbac/PhpManager.php b/framework/yii/rbac/PhpManager.php index 57ede09..78e4d8c 100644 --- a/framework/yii/rbac/PhpManager.php +++ b/framework/yii/rbac/PhpManager.php @@ -221,6 +221,22 @@ class PhpManager extends Manager } /** + * Revokes all authorization assignments from a user. + * @param mixed $userId the user ID (see [[User::id]]) + * @return boolean whether removal is successful + */ + public function revokeAll($userId) + { + if (isset($this->_assignments[$userId]) && is_array($this->_assignments[$userId])) { + foreach ($this->_assignments[$userId] as $itemName => $value) + unset($this->_assignments[$userId][$itemName]); + return true; + } else { + return false; + } + } + + /** * Returns a value indicating whether the item has been assigned to the user. * @param mixed $userId the user ID (see [[User::id]]) * @param string $itemName the item name diff --git a/tests/unit/framework/rbac/ManagerTestCase.php b/tests/unit/framework/rbac/ManagerTestCase.php index 3bf80ad..cbf8de8 100644 --- a/tests/unit/framework/rbac/ManagerTestCase.php +++ b/tests/unit/framework/rbac/ManagerTestCase.php @@ -119,6 +119,12 @@ abstract class ManagerTestCase extends TestCase $this->assertFalse($this->auth->revoke('author B', 'author')); } + public function testRevokeAll() + { + $this->assertTrue($this->auth->revokeAll('reader E')); + $this->assertFalse($this->auth->isAssigned('reader E', 'reader')); + } + public function testGetAssignments() { $this->auth->assign('author B', 'deletePost'); @@ -201,6 +207,13 @@ abstract class ManagerTestCase extends TestCase 'updateOwnPost' => false, 'deletePost' => true, ], + 'reader E' => [ + 'createPost' => false, + 'readPost' => false, + 'updatePost' => false, + 'updateOwnPost' => false, + 'deletePost' => false, + ], ]; $params = ['authorID' => 'author B']; @@ -245,5 +258,6 @@ abstract class ManagerTestCase extends TestCase $this->auth->assign('author B', 'author'); $this->auth->assign('editor C', 'editor'); $this->auth->assign('admin D', 'admin'); + $this->auth->assign('reader E', 'reader'); } }