Authentication.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\App\Action\Plugin;
  7. use Magento\Framework\Exception\AuthenticationException;
  8. /**
  9. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  10. */
  11. class Authentication
  12. {
  13. /**
  14. * @var \Magento\Backend\Model\Auth
  15. */
  16. protected $_auth;
  17. /**
  18. * @var string[]
  19. */
  20. protected $_openActions = [
  21. 'forgotpassword',
  22. 'resetpassword',
  23. 'resetpasswordpost',
  24. 'logout',
  25. 'refresh', // captcha refresh
  26. ];
  27. /**
  28. * @var \Magento\Backend\Model\UrlInterface
  29. */
  30. protected $_url;
  31. /**
  32. * @var \Magento\Framework\App\ResponseInterface
  33. */
  34. protected $_response;
  35. /**
  36. * @var \Magento\Framework\App\ActionFlag
  37. */
  38. protected $_actionFlag;
  39. /**
  40. * @var \Magento\Framework\Message\ManagerInterface
  41. */
  42. protected $messageManager;
  43. /**
  44. * @var \Magento\Backend\Model\UrlInterface
  45. */
  46. protected $backendUrl;
  47. /**
  48. * @var \Magento\Backend\App\BackendAppList
  49. */
  50. protected $backendAppList;
  51. /**
  52. * @var \Magento\Framework\Controller\Result\RedirectFactory
  53. */
  54. protected $resultRedirectFactory;
  55. /**
  56. * @var \Magento\Framework\Data\Form\FormKey\Validator
  57. */
  58. protected $formKeyValidator;
  59. /**
  60. * @param \Magento\Backend\Model\Auth $auth
  61. * @param \Magento\Backend\Model\UrlInterface $url
  62. * @param \Magento\Framework\App\ResponseInterface $response
  63. * @param \Magento\Framework\App\ActionFlag $actionFlag
  64. * @param \Magento\Framework\Message\ManagerInterface $messageManager
  65. * @param \Magento\Backend\Model\UrlInterface $backendUrl
  66. * @param \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory
  67. * @param \Magento\Backend\App\BackendAppList $backendAppList
  68. * @param \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
  69. */
  70. public function __construct(
  71. \Magento\Backend\Model\Auth $auth,
  72. \Magento\Backend\Model\UrlInterface $url,
  73. \Magento\Framework\App\ResponseInterface $response,
  74. \Magento\Framework\App\ActionFlag $actionFlag,
  75. \Magento\Framework\Message\ManagerInterface $messageManager,
  76. \Magento\Backend\Model\UrlInterface $backendUrl,
  77. \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory,
  78. \Magento\Backend\App\BackendAppList $backendAppList,
  79. \Magento\Framework\Data\Form\FormKey\Validator $formKeyValidator
  80. ) {
  81. $this->_auth = $auth;
  82. $this->_url = $url;
  83. $this->_response = $response;
  84. $this->_actionFlag = $actionFlag;
  85. $this->messageManager = $messageManager;
  86. $this->backendUrl = $backendUrl;
  87. $this->resultRedirectFactory = $resultRedirectFactory;
  88. $this->backendAppList = $backendAppList;
  89. $this->formKeyValidator = $formKeyValidator;
  90. }
  91. /**
  92. * @param \Magento\Backend\App\AbstractAction $subject
  93. * @param \Closure $proceed
  94. * @param \Magento\Framework\App\RequestInterface $request
  95. *
  96. * @return mixed
  97. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  98. */
  99. public function aroundDispatch(
  100. \Magento\Backend\App\AbstractAction $subject,
  101. \Closure $proceed,
  102. \Magento\Framework\App\RequestInterface $request
  103. ) {
  104. $requestedActionName = $request->getActionName();
  105. if (in_array($requestedActionName, $this->_openActions)) {
  106. $request->setDispatched(true);
  107. } else {
  108. if ($this->_auth->getUser()) {
  109. $this->_auth->getUser()->reload();
  110. }
  111. if (!$this->_auth->isLoggedIn()) {
  112. $this->_processNotLoggedInUser($request);
  113. } else {
  114. $this->_auth->getAuthStorage()->prolong();
  115. $backendApp = null;
  116. if ($request->getParam('app')) {
  117. $backendApp = $this->backendAppList->getCurrentApp();
  118. }
  119. if ($backendApp) {
  120. $resultRedirect = $this->resultRedirectFactory->create();
  121. $baseUrl = \Magento\Framework\App\Request\Http::getUrlNoScript($this->backendUrl->getBaseUrl());
  122. $baseUrl = $baseUrl . $backendApp->getStartupPage();
  123. return $resultRedirect->setUrl($baseUrl);
  124. }
  125. }
  126. }
  127. $this->_auth->getAuthStorage()->refreshAcl();
  128. return $proceed($request);
  129. }
  130. /**
  131. * Process not logged in user data
  132. *
  133. * @param \Magento\Framework\App\RequestInterface $request
  134. * @return void
  135. */
  136. protected function _processNotLoggedInUser(\Magento\Framework\App\RequestInterface $request)
  137. {
  138. $isRedirectNeeded = false;
  139. if ($request->getPost('login')) {
  140. if ($this->formKeyValidator->validate($request)) {
  141. if ($this->_performLogin($request)) {
  142. $isRedirectNeeded = $this->_redirectIfNeededAfterLogin($request);
  143. }
  144. } else {
  145. $this->_actionFlag->set('', \Magento\Framework\App\ActionInterface::FLAG_NO_DISPATCH, true);
  146. $this->_response->setRedirect($this->_url->getCurrentUrl());
  147. $this->messageManager->addErrorMessage(__('Invalid Form Key. Please refresh the page.'));
  148. $isRedirectNeeded = true;
  149. }
  150. }
  151. if (!$isRedirectNeeded && !$request->isForwarded()) {
  152. if ($request->getParam('isIframe')) {
  153. $request->setForwarded(true)
  154. ->setRouteName('adminhtml')
  155. ->setControllerName('auth')
  156. ->setActionName('deniedIframe')
  157. ->setDispatched(false);
  158. } elseif ($request->getParam('isAjax')) {
  159. $request->setForwarded(true)
  160. ->setRouteName('adminhtml')
  161. ->setControllerName('auth')
  162. ->setActionName('deniedJson')
  163. ->setDispatched(false);
  164. } else {
  165. $request->setForwarded(true)
  166. ->setRouteName('adminhtml')
  167. ->setControllerName('auth')
  168. ->setActionName('login')
  169. ->setDispatched(false);
  170. }
  171. }
  172. }
  173. /**
  174. * Performs login, if user submitted login form
  175. *
  176. * @param \Magento\Framework\App\RequestInterface $request
  177. * @return bool
  178. */
  179. protected function _performLogin(\Magento\Framework\App\RequestInterface $request)
  180. {
  181. $outputValue = true;
  182. $postLogin = $request->getPost('login');
  183. $username = isset($postLogin['username']) ? $postLogin['username'] : '';
  184. $password = isset($postLogin['password']) ? $postLogin['password'] : '';
  185. $request->setPostValue('login', null);
  186. try {
  187. $this->_auth->login($username, $password);
  188. } catch (AuthenticationException $e) {
  189. if (!$request->getParam('messageSent')) {
  190. $this->messageManager->addErrorMessage($e->getMessage());
  191. $request->setParam('messageSent', true);
  192. $outputValue = false;
  193. }
  194. }
  195. return $outputValue;
  196. }
  197. /**
  198. * Checks, whether Magento requires redirection after successful admin login, and redirects user, if needed
  199. *
  200. * @param \Magento\Framework\App\RequestInterface $request
  201. * @return bool
  202. */
  203. protected function _redirectIfNeededAfterLogin(\Magento\Framework\App\RequestInterface $request)
  204. {
  205. $requestUri = null;
  206. // Checks, whether secret key is required for admin access or request uri is explicitly set
  207. if ($this->_url->useSecretKey()) {
  208. $requestUri = $this->_url->getUrl('*/*/*', ['_current' => true]);
  209. } elseif ($request) {
  210. $requestUri = $request->getRequestUri();
  211. }
  212. if (!$requestUri) {
  213. return false;
  214. }
  215. $this->_response->setRedirect($requestUri);
  216. $this->_actionFlag->set('', \Magento\Framework\App\ActionInterface::FLAG_NO_DISPATCH, true);
  217. return true;
  218. }
  219. }