Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SaveRole.php
Go to the documentation of this file.
1 <?php
9 
10 use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
16 
20 class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role implements HttpPostActionInterface
21 {
25  const ROLE_EDIT_FORM_DATA_SESSION_KEY = 'role_edit_form_data';
26 
30  const IN_ROLE_USER_FORM_DATA_SESSION_KEY = 'in_role_user_form_data';
31 
35  const IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY = 'in_role_old_user_form_data';
36 
40  const RESOURCE_ALL_FORM_DATA_SESSION_KEY = 'resource_all_form_data';
41 
45  const RESOURCE_FORM_DATA_SESSION_KEY = 'resource_form_data';
46 
50  private $securityCookie;
51 
58  private function getSecurityCookie()
59  {
60  if (!($this->securityCookie instanceof SecurityCookie)) {
61  return \Magento\Framework\App\ObjectManager::getInstance()->get(SecurityCookie::class);
62  } else {
63  return $this->securityCookie;
64  }
65  }
66 
72  public function execute()
73  {
75  $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
76 
77  $rid = $this->getRequest()->getParam('role_id', false);
78  $resource = $this->getRequest()->getParam('resource', false);
79  $roleUsers = $this->getRequest()->getParam('in_role_user', null);
80  parse_str($roleUsers, $roleUsers);
81  $roleUsers = array_keys($roleUsers);
82 
83  $isAll = $this->getRequest()->getParam('all');
84  if ($isAll) {
85  $resource = [$this->_objectManager->get(\Magento\Framework\Acl\RootResource::class)->getId()];
86  }
87 
88  $role = $this->_initRole('role_id');
89  if (!$role->getId() && $rid) {
90  $this->messageManager->addError(__('This role no longer exists.'));
91  return $resultRedirect->setPath('adminhtml/*/');
92  }
93 
94  try {
95  $this->validateUser();
96  $roleName = $this->_filterManager->removeTags($this->getRequest()->getParam('rolename', false));
97  $role->setName($roleName)
98  ->setPid($this->getRequest()->getParam('parent_id', false))
99  ->setRoleType(RoleGroup::ROLE_TYPE)
100  ->setUserType(UserContextInterface::USER_TYPE_ADMIN);
101  $this->_eventManager->dispatch(
102  'admin_permissions_role_prepare_save',
103  ['object' => $role, 'request' => $this->getRequest()]
104  );
105  $role->save();
106 
107  $this->_rulesFactory->create()->setRoleId($role->getId())->setResources($resource)->saveRel();
108 
109  $this->processPreviousUsers($role);
110 
111  foreach ($roleUsers as $nRuid) {
112  $this->_addUserToRole($nRuid, $role->getId());
113  }
114  $this->messageManager->addSuccess(__('You saved the role.'));
115  } catch (UserLockedException $e) {
116  $this->_auth->logout();
117  $this->getSecurityCookie()->setLogoutReasonCookie(
118  \Magento\Security\Model\AdminSessionsManager::LOGOUT_REASON_USER_LOCKED
119  );
120  return $resultRedirect->setPath('*');
121  } catch (\Magento\Framework\Exception\AuthenticationException $e) {
122  $this->messageManager->addError(
123  __('The password entered for the current user is invalid. Verify the password and try again.')
124  );
125  return $this->saveDataToSessionAndRedirect($role, $this->getRequest()->getPostValue(), $resultRedirect);
126  } catch (\Magento\Framework\Exception\LocalizedException $e) {
127  $this->messageManager->addError($e->getMessage());
128  } catch (\Exception $e) {
129  $this->messageManager->addError(__('An error occurred while saving this role.'));
130  }
131 
132  return $resultRedirect->setPath('*/*/');
133  }
134 
142  protected function validateUser()
143  {
144  $password = $this->getRequest()->getParam(
145  \Magento\User\Block\Role\Tab\Info::IDENTITY_VERIFICATION_PASSWORD_FIELD
146  );
147  $user = $this->_authSession->getUser();
148  $user->performIdentityCheck($password);
149 
150  return $this;
151  }
152 
158  protected function processPreviousUsers(\Magento\Authorization\Model\Role $role)
159  {
160  $oldRoleUsers = $this->getRequest()->getParam('in_role_user_old');
161  parse_str($oldRoleUsers, $oldRoleUsers);
162  $oldRoleUsers = array_keys($oldRoleUsers);
163 
164  foreach ($oldRoleUsers as $oUid) {
165  $this->_deleteUserFromRole($oUid, $role->getId());
166  }
167 
168  return $this;
169  }
170 
178  protected function _addUserToRole($userId, $roleId)
179  {
180  $user = $this->_userFactory->create()->load($userId);
181  $user->setRoleId($roleId);
182 
183  if ($user->roleUserExists() === true) {
184  return false;
185  } else {
186  $user->save();
187  return true;
188  }
189  }
190 
199  protected function _deleteUserFromRole($userId, $roleId)
200  {
201  try {
202  $this->_userFactory->create()->setRoleId($roleId)->setUserId($userId)->deleteFromRole();
203  } catch (\Exception $e) {
204  throw $e;
205  }
206  return true;
207  }
208 
215  protected function saveDataToSessionAndRedirect($role, $data, $resultRedirect)
216  {
217  $this->_getSession()->setData(self::ROLE_EDIT_FORM_DATA_SESSION_KEY, ['rolename' => $data['rolename']]);
218  $this->_getSession()->setData(self::IN_ROLE_USER_FORM_DATA_SESSION_KEY, $data['in_role_user']);
219  $this->_getSession()->setData(self::IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY, $data['in_role_user_old']);
220  if ($data['all']) {
221  $this->_getSession()->setData(self::RESOURCE_ALL_FORM_DATA_SESSION_KEY, $data['all']);
222  } else {
223  $resource = isset($data['resource']) ? $data['resource'] : [];
224  $this->_getSession()->setData(self::RESOURCE_FORM_DATA_SESSION_KEY, $resource);
225  }
226  $arguments = $role->getId() ? ['rid' => $role->getId()] : [];
227  return $resultRedirect->setPath('*/*/editrole', $arguments);
228  }
229 }
__()
Definition: __.php:13
$resource
Definition: bulk.php:12
_initRole($requestVariable='rid')
Definition: Role.php:107
saveDataToSessionAndRedirect($role, $data, $resultRedirect)
Definition: SaveRole.php:215
$user
Definition: dummy_user.php:13
$roleId
Definition: webapi_user.php:22
$arguments
processPreviousUsers(\Magento\Authorization\Model\Role $role)
Definition: SaveRole.php:158