Skip to content

Commit 8a64a29

Browse files
author
Oleksandr Dubovyk
committed
MAGETWO-95536: [2.3] Admin users are deleted from role upon Role save
- fixed - added test
1 parent 77af5d6 commit 8a64a29

File tree

5 files changed

+201
-22
lines changed

5 files changed

+201
-22
lines changed

app/code/Magento/Integration/Plugin/Model/AdminUser.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Integration\Plugin\Model;
78

89
use Magento\Integration\Model\AdminTokenService;
@@ -31,14 +32,15 @@ public function __construct(
3132
*
3233
* @param \Magento\User\Model\User $subject
3334
* @param \Magento\Framework\DataObject $object
34-
* @return $this
35+
* @return \Magento\User\Model\User
36+
* @throws \Magento\Framework\Exception\LocalizedException
3537
*/
3638
public function afterSave(
3739
\Magento\User\Model\User $subject,
3840
\Magento\Framework\DataObject $object
39-
) {
41+
): \Magento\User\Model\User {
4042
$isActive = $object->getIsActive();
41-
if (isset($isActive) && $isActive == 0) {
43+
if ($isActive !== null && $isActive == 0) {
4244
$this->adminTokenService->revokeAdminAccessToken($object->getId());
4345
}
4446
return $subject;

app/code/Magento/User/Controller/Adminhtml/User/Role/SaveRole.php

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
1212
use Magento\Authorization\Model\UserContextInterface;
1313
use Magento\Framework\Controller\ResultFactory;
14+
use Magento\Framework\Exception\LocalizedException;
1415
use Magento\Framework\Exception\State\UserLockedException;
1516
use Magento\Security\Model\SecurityCookie;
1617

@@ -77,10 +78,8 @@ public function execute()
7778

7879
$rid = $this->getRequest()->getParam('role_id', false);
7980
$resource = $this->getRequest()->getParam('resource', false);
80-
$roleUsers = $this->getRequest()->getParam('in_role_user', null);
81-
parse_str($roleUsers, $roleUsers);
82-
$roleUsers = array_keys($roleUsers);
83-
81+
$oldRoleUsers = $this->parseRequestVariable('in_role_user_old');
82+
$roleUsers = $this->parseRequestVariable('in_role_user');
8483
$isAll = $this->getRequest()->getParam('all');
8584
if ($isAll) {
8685
$resource = [$this->_objectManager->get(\Magento\Framework\Acl\RootResource::class)->getId()];
@@ -106,28 +105,24 @@ public function execute()
106105
$role->save();
107106

108107
$this->_rulesFactory->create()->setRoleId($role->getId())->setResources($resource)->saveRel();
109-
110-
$this->processPreviousUsers($role);
111-
112-
foreach ($roleUsers as $nRuid) {
113-
$this->_addUserToRole($nRuid, $role->getId());
114-
}
115-
$this->messageManager->addSuccess(__('You saved the role.'));
108+
$this->processPreviousUsers($role, $oldRoleUsers);
109+
$this->processCurrentUsers($role, $roleUsers);
110+
$this->messageManager->addSuccessMessage(__('You saved the role.'));
116111
} catch (UserLockedException $e) {
117112
$this->_auth->logout();
118113
$this->getSecurityCookie()->setLogoutReasonCookie(
119114
\Magento\Security\Model\AdminSessionsManager::LOGOUT_REASON_USER_LOCKED
120115
);
121116
return $resultRedirect->setPath('*');
122117
} catch (\Magento\Framework\Exception\AuthenticationException $e) {
123-
$this->messageManager->addError(
118+
$this->messageManager->addErrorMessage(
124119
__('The password entered for the current user is invalid. Verify the password and try again.')
125120
);
126121
return $this->saveDataToSessionAndRedirect($role, $this->getRequest()->getPostValue(), $resultRedirect);
127122
} catch (\Magento\Framework\Exception\LocalizedException $e) {
128-
$this->messageManager->addError($e->getMessage());
123+
$this->messageManager->addErrorMessage($e->getMessage());
129124
} catch (\Exception $e) {
130-
$this->messageManager->addError(__('An error occurred while saving this role.'));
125+
$this->messageManager->addErrorMessage(__('An error occurred while saving this role.'));
131126
}
132127

133128
return $resultRedirect->setPath('*/*/');
@@ -151,32 +146,64 @@ protected function validateUser()
151146
return $this;
152147
}
153148

149+
/**
150+
* Parse request value from string
151+
*
152+
* @param string $paramName
153+
* @return array
154+
*/
155+
private function parseRequestVariable($paramName): array
156+
{
157+
$value = $this->getRequest()->getParam($paramName, null);
158+
parse_str($value, $value);
159+
$value = array_keys($value);
160+
return $value;
161+
}
162+
154163
/**
155164
* Process previous users
156165
*
157166
* @param \Magento\Authorization\Model\Role $role
167+
* @param array $oldRoleUsers
158168
* @return $this
159169
* @throws \Exception
160170
*/
161-
protected function processPreviousUsers(\Magento\Authorization\Model\Role $role)
171+
protected function processPreviousUsers(\Magento\Authorization\Model\Role $role, array $oldRoleUsers): self
162172
{
163-
$oldRoleUsers = $this->getRequest()->getParam('in_role_user_old');
164-
parse_str($oldRoleUsers, $oldRoleUsers);
165-
$oldRoleUsers = array_keys($oldRoleUsers);
166-
167173
foreach ($oldRoleUsers as $oUid) {
168174
$this->_deleteUserFromRole($oUid, $role->getId());
169175
}
170176

171177
return $this;
172178
}
173179

180+
/**
181+
* Processes users to be assigned to roles
182+
*
183+
* @param \Magento\Authorization\Model\Role $role
184+
* @param array $roleUsers
185+
* @return $this
186+
*/
187+
private function processCurrentUsers(\Magento\Authorization\Model\Role $role, array $roleUsers): self
188+
{
189+
foreach ($roleUsers as $nRuid) {
190+
try {
191+
$this->_addUserToRole($nRuid, $role->getId());
192+
} catch (LocalizedException $e) {
193+
$this->messageManager->addErrorMessage($e->getMessage());
194+
}
195+
}
196+
197+
return $this;
198+
}
199+
174200
/**
175201
* Assign user to role
176202
*
177203
* @param int $userId
178204
* @param int $roleId
179205
* @return bool
206+
* @throws LocalizedException
180207
*/
181208
protected function _addUserToRole($userId, $roleId)
182209
{
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Magento\User\Controller\Adminhtml\User\Role;
10+
11+
use Magento\TestFramework\Helper\Bootstrap;
12+
use Magento\User\Model\User;
13+
use Magento\Backend\Model\Auth\Session;
14+
use Magento\Framework\Message\MessageInterface;
15+
use Magento\User\Controller\Adminhtml\User\Role\SaveRole;
16+
17+
/**
18+
* Test class for \Magento\User\Controller\Adminhtml\User\Role.
19+
*
20+
* @magentoAppArea adminhtml
21+
*/
22+
class SaveRoleTest extends \Magento\TestFramework\TestCase\AbstractBackendController
23+
{
24+
/**
25+
* Test execute method
26+
*
27+
* @magentoDataFixture Magento/User/_files/two_users_with_role.php
28+
* @magentoDbIsolation disabled
29+
*/
30+
public function testExecute()
31+
{
32+
$objectManager = Bootstrap::getObjectManager();
33+
/** @var \Magento\User\Model\User $currentAdmin */
34+
$currentAdmin = $objectManager->create(User::class)
35+
->loadByUsername('user');
36+
/** @var \Magento\Backend\Model\Auth\Session $authSession */
37+
$authSession = $objectManager->create(Session::class);
38+
$authSession->setUser($currentAdmin);
39+
$user1Id = $objectManager->create(User::class)
40+
->loadByUsername('johnAdmin')->getId();
41+
$user2Id = $objectManager->create(User::class)
42+
->loadByUsername('annAdmin')->getId();
43+
44+
/** @var \Magento\Authorization\Model\RoleFactory $roleFactory */
45+
$roleFactory = $objectManager->create(\Magento\Authorization\Model\RoleFactory::class);
46+
$role = $roleFactory->create()->load(1);
47+
48+
/** @var \Magento\AdminGws\Model\Role $gwsRole */
49+
$gwsRole = $objectManager->get(\Magento\AdminGws\Model\Role::class);
50+
$gwsRole->setAdminRole($role);
51+
$gwsRole->setStoreGroupIds([1]);
52+
53+
$params = [
54+
'role_id' => 1,
55+
'in_role_user_old'=> $user1Id . '=true&' . $user2Id . '=true',
56+
'in_role_user'=> $user1Id . '=true&' . $user2Id . '=true',
57+
'all' => 1,
58+
'current_password' => 'password1',
59+
'rolename' => 'Administrators',
60+
];
61+
62+
$post = [
63+
'gws_is_all' => 1,
64+
'gws_store_groups' => ['1'],
65+
];
66+
67+
$this->getRequest()->setParams($params);
68+
$this->getRequest()->setPostValue($post);
69+
70+
$model = $objectManager->create(SaveRole::class);
71+
$model->execute();
72+
$this->assertSessionMessages(
73+
$this->equalTo(['You saved the role.']),
74+
MessageInterface::TYPE_SUCCESS
75+
);
76+
}
77+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\TestFramework\Helper\Bootstrap;
9+
use Magento\User\Model\User;
10+
11+
/**
12+
* Create an admin user with an assigned role
13+
*/
14+
15+
$objectManager = Bootstrap::getObjectManager();
16+
17+
/** @var \Magento\User\Model\ResourceModel\User $model */
18+
$userResource = $objectManager->create(\Magento\User\Model\ResourceModel\User::class);
19+
20+
/** @var $user User */
21+
$user = $objectManager->create(User::class);
22+
$user->setFirstname("John")
23+
->setIsActive(true)
24+
->setLastname("Doe")
25+
->setUsername('johnAdmin')
26+
->setPassword(\Magento\TestFramework\Bootstrap::ADMIN_PASSWORD)
27+
->setEmail('[email protected]')
28+
->setRoleType('G')
29+
->setResourceId('Magento_Backend::all')
30+
->setPrivileges("")
31+
->setAssertId(0)
32+
->setRoleId(1)
33+
->setPermission('allow');
34+
35+
$userResource->save($user);
36+
37+
/** @var $user User */
38+
$user = $objectManager->create(User::class);
39+
$user->setFirstname("Ann")
40+
->setIsActive(true)
41+
->setLastname("Doe")
42+
->setUsername('annAdmin')
43+
->setPassword(\Magento\TestFramework\Bootstrap::ADMIN_PASSWORD)
44+
->setEmail('[email protected]')
45+
->setRoleType('G')
46+
->setResourceId('Magento_Backend::all')
47+
->setPrivileges("")
48+
->setAssertId(0)
49+
->setRoleId(1)
50+
->setPermission('allow');
51+
52+
$userResource->save($user);
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\TestFramework\Helper\Bootstrap;
9+
use Magento\User\Model\User;
10+
11+
/**
12+
* Create an admin user with an assigned role
13+
*/
14+
15+
/** @var $user User */
16+
$user = Bootstrap::getObjectManager()->create(User::class);
17+
$user->loadByUsername('johnAdmin')->delete();
18+
19+
/** @var $user User */
20+
$user = Bootstrap::getObjectManager()->create(User::class);
21+
$user->loadByUsername('annAdmin')->delete();

0 commit comments

Comments
 (0)