SaveRole.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\User\Controller\Adminhtml\User\Role;
  8. use Magento\Framework\App\Action\HttpPostActionInterface as HttpPostActionInterface;
  9. use Magento\Authorization\Model\Acl\Role\Group as RoleGroup;
  10. use Magento\Authorization\Model\UserContextInterface;
  11. use Magento\Framework\Controller\ResultFactory;
  12. use Magento\Framework\Exception\LocalizedException;
  13. use Magento\Framework\Exception\State\UserLockedException;
  14. use Magento\Security\Model\SecurityCookie;
  15. /**
  16. * Save role controller
  17. *
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. class SaveRole extends \Magento\User\Controller\Adminhtml\User\Role implements HttpPostActionInterface
  21. {
  22. /**
  23. * Session keys for Info form data
  24. */
  25. const ROLE_EDIT_FORM_DATA_SESSION_KEY = 'role_edit_form_data';
  26. /**
  27. * Session keys for Users form data
  28. */
  29. const IN_ROLE_USER_FORM_DATA_SESSION_KEY = 'in_role_user_form_data';
  30. /**
  31. * Session keys for original Users form data
  32. */
  33. const IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY = 'in_role_old_user_form_data';
  34. /**
  35. * Session keys for Use all resources flag form data
  36. */
  37. const RESOURCE_ALL_FORM_DATA_SESSION_KEY = 'resource_all_form_data';
  38. /**
  39. * Session keys for Resource form data
  40. */
  41. const RESOURCE_FORM_DATA_SESSION_KEY = 'resource_form_data';
  42. /**
  43. * @var SecurityCookie
  44. */
  45. private $securityCookie;
  46. /**
  47. * Get security cookie
  48. *
  49. * @return SecurityCookie
  50. * @deprecated 100.1.0
  51. */
  52. private function getSecurityCookie()
  53. {
  54. if (!($this->securityCookie instanceof SecurityCookie)) {
  55. return \Magento\Framework\App\ObjectManager::getInstance()->get(SecurityCookie::class);
  56. }
  57. return $this->securityCookie;
  58. }
  59. /**
  60. * Role form submit action to save or create new role
  61. *
  62. * @return \Magento\Backend\Model\View\Result\Redirect
  63. */
  64. public function execute()
  65. {
  66. /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
  67. $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
  68. $rid = $this->getRequest()->getParam('role_id', false);
  69. $resource = $this->getRequest()->getParam('resource', false);
  70. $oldRoleUsers = $this->parseRequestVariable('in_role_user_old');
  71. $roleUsers = $this->parseRequestVariable('in_role_user');
  72. $isAll = $this->getRequest()->getParam('all');
  73. if ($isAll) {
  74. $resource = [$this->_objectManager->get(\Magento\Framework\Acl\RootResource::class)->getId()];
  75. }
  76. $role = $this->_initRole('role_id');
  77. if (!$role->getId() && $rid) {
  78. $this->messageManager->addError(__('This role no longer exists.'));
  79. return $resultRedirect->setPath('adminhtml/*/');
  80. }
  81. try {
  82. $this->validateUser();
  83. $roleName = $this->_filterManager->removeTags($this->getRequest()->getParam('rolename', false));
  84. $role->setName($roleName)
  85. ->setPid($this->getRequest()->getParam('parent_id', false))
  86. ->setRoleType(RoleGroup::ROLE_TYPE)
  87. ->setUserType(UserContextInterface::USER_TYPE_ADMIN);
  88. $this->_eventManager->dispatch(
  89. 'admin_permissions_role_prepare_save',
  90. ['object' => $role, 'request' => $this->getRequest()]
  91. );
  92. $role->save();
  93. $this->_rulesFactory->create()->setRoleId($role->getId())->setResources($resource)->saveRel();
  94. $this->processPreviousUsers($role, $oldRoleUsers);
  95. $this->processCurrentUsers($role, $roleUsers);
  96. $this->messageManager->addSuccessMessage(__('You saved the role.'));
  97. } catch (UserLockedException $e) {
  98. $this->_auth->logout();
  99. $this->getSecurityCookie()->setLogoutReasonCookie(
  100. \Magento\Security\Model\AdminSessionsManager::LOGOUT_REASON_USER_LOCKED
  101. );
  102. return $resultRedirect->setPath('*');
  103. } catch (\Magento\Framework\Exception\AuthenticationException $e) {
  104. $this->messageManager->addErrorMessage(
  105. __('The password entered for the current user is invalid. Verify the password and try again.')
  106. );
  107. return $this->saveDataToSessionAndRedirect($role, $this->getRequest()->getPostValue(), $resultRedirect);
  108. } catch (\Magento\Framework\Exception\LocalizedException $e) {
  109. $this->messageManager->addErrorMessage($e->getMessage());
  110. } catch (\Exception $e) {
  111. $this->messageManager->addErrorMessage(__('An error occurred while saving this role.'));
  112. }
  113. return $resultRedirect->setPath('*/*/');
  114. }
  115. /**
  116. * Validate current user password
  117. *
  118. * @return $this
  119. * @throws UserLockedException
  120. * @throws \Magento\Framework\Exception\AuthenticationException
  121. */
  122. protected function validateUser()
  123. {
  124. $password = $this->getRequest()->getParam(
  125. \Magento\User\Block\Role\Tab\Info::IDENTITY_VERIFICATION_PASSWORD_FIELD
  126. );
  127. $user = $this->_authSession->getUser();
  128. $user->performIdentityCheck($password);
  129. return $this;
  130. }
  131. /**
  132. * Parse request value from string
  133. *
  134. * @param string $paramName
  135. * @return array
  136. */
  137. private function parseRequestVariable($paramName): array
  138. {
  139. $value = $this->getRequest()->getParam($paramName, null);
  140. parse_str($value, $value);
  141. $value = array_keys($value);
  142. return $value;
  143. }
  144. /**
  145. * Process previous users
  146. *
  147. * @param \Magento\Authorization\Model\Role $role
  148. * @param array $oldRoleUsers
  149. * @return $this
  150. * @throws \Exception
  151. */
  152. protected function processPreviousUsers(\Magento\Authorization\Model\Role $role, array $oldRoleUsers): self
  153. {
  154. foreach ($oldRoleUsers as $oUid) {
  155. $this->_deleteUserFromRole($oUid, $role->getId());
  156. }
  157. return $this;
  158. }
  159. /**
  160. * Processes users to be assigned to roles
  161. *
  162. * @param \Magento\Authorization\Model\Role $role
  163. * @param array $roleUsers
  164. * @return $this
  165. */
  166. private function processCurrentUsers(\Magento\Authorization\Model\Role $role, array $roleUsers): self
  167. {
  168. foreach ($roleUsers as $nRuid) {
  169. try {
  170. $this->_addUserToRole($nRuid, $role->getId());
  171. } catch (LocalizedException $e) {
  172. $this->messageManager->addErrorMessage($e->getMessage());
  173. }
  174. }
  175. return $this;
  176. }
  177. /**
  178. * Assign user to role
  179. *
  180. * @param int $userId
  181. * @param int $roleId
  182. * @return bool
  183. * @throws LocalizedException
  184. */
  185. protected function _addUserToRole($userId, $roleId)
  186. {
  187. $user = $this->_userFactory->create()->load($userId);
  188. $user->setRoleId($roleId);
  189. if ($user->roleUserExists() === true) {
  190. return false;
  191. } else {
  192. $user->save();
  193. return true;
  194. }
  195. }
  196. /**
  197. * Remove user from role
  198. *
  199. * @param int $userId
  200. * @param int $roleId
  201. * @return bool
  202. * @throws \Exception
  203. */
  204. protected function _deleteUserFromRole($userId, $roleId)
  205. {
  206. try {
  207. $this->_userFactory->create()->setRoleId($roleId)->setUserId($userId)->deleteFromRole();
  208. } catch (\Exception $e) {
  209. throw $e;
  210. }
  211. return true;
  212. }
  213. /**
  214. * Save data to session and redirect
  215. *
  216. * @param \Magento\Authorization\Model\Role $role
  217. * @param array $data
  218. * @param \Magento\Backend\Model\View\Result\Redirect $resultRedirect
  219. * @return \Magento\Backend\Model\View\Result\Redirect
  220. */
  221. protected function saveDataToSessionAndRedirect($role, $data, $resultRedirect)
  222. {
  223. $this->_getSession()->setData(self::ROLE_EDIT_FORM_DATA_SESSION_KEY, ['rolename' => $data['rolename']]);
  224. $this->_getSession()->setData(self::IN_ROLE_USER_FORM_DATA_SESSION_KEY, $data['in_role_user']);
  225. $this->_getSession()->setData(self::IN_ROLE_OLD_USER_FORM_DATA_SESSION_KEY, $data['in_role_user_old']);
  226. if ($data['all']) {
  227. $this->_getSession()->setData(self::RESOURCE_ALL_FORM_DATA_SESSION_KEY, $data['all']);
  228. } else {
  229. $resource = isset($data['resource']) ? $data['resource'] : [];
  230. $this->_getSession()->setData(self::RESOURCE_FORM_DATA_SESSION_KEY, $resource);
  231. }
  232. $arguments = $role->getId() ? ['rid' => $role->getId()] : [];
  233. return $resultRedirect->setPath('*/*/editrole', $arguments);
  234. }
  235. }