diff --git a/core/modules/user/src/Controller/UserController.php b/core/modules/user/src/Controller/UserController.php index 9a63005..bd46370 100644 --- a/core/modules/user/src/Controller/UserController.php +++ b/core/modules/user/src/Controller/UserController.php @@ -30,12 +30,7 @@ class UserController extends ControllerBase { * Returns either a redirect to the user page or the to the user login form. */ public function userPage(Request $request) { - if ($user_id = $this->currentUser()->id()) { - return $this->redirect('user.view', array('user' => $user_id)); - } - else { - return $this->redirect('user.login'); - } + return $this->redirect('user.view', array('user' => $this->currentUser()->id())); } /** diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php new file mode 100644 index 0000000..9e671ce --- /dev/null +++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php @@ -0,0 +1,90 @@ +account = $account; + $this->urlGenerator = $url_generator; + } + + /** + * Redirects anonymous users from user.page to user.login. + * + * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event + * The event to process. + */ + public function onException(GetResponseForExceptionEvent $event) { + $exception = $event->getException(); + if ($exception instanceof AccessDeniedHttpException) { + $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName(); + if ($route_name == 'user.page' && !$this->account->isAuthenticated()) { + $event->setResponse(new RedirectResponse($this->url('user.login', array(), array('absolute' => TRUE)))); + } + } + } + + /** + * Generates a URL or path for a specific route based on the given parameters. + * + * @see \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for + * details on the arguments, usage, and possible exceptions. + * + * @return string + * The generated URL for the given route. + * + * @todo: Use UrlGeneratorTrait (see https://www.drupal.org/node/2282161) + */ + protected function url($route_name, $route_parameters = array(), $options = array()) { + return $this->urlGenerator->generateFromRoute($route_name, $route_parameters, $options); + } + + /** + * {@inheritdoc} + */ + public static function getSubscribedEvents() { + $events[KernelEvents::EXCEPTION][] = array('onException'); + return $events; + } + +} diff --git a/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php b/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php index 14d96cc..39cee7c 100644 --- a/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php +++ b/core/modules/user/src/EventSubscriber/MaintenanceModeSubscriber.php @@ -42,7 +42,6 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) { if ($user->isAnonymous()) { switch ($path) { - case 'user': case 'user/login': case 'user/password': // Disable offline mode. diff --git a/core/modules/user/src/Tests/UserAccountLinksTests.php b/core/modules/user/src/Tests/UserAccountLinksTests.php index ce936e4..49dc13f 100644 --- a/core/modules/user/src/Tests/UserAccountLinksTests.php +++ b/core/modules/user/src/Tests/UserAccountLinksTests.php @@ -70,10 +70,7 @@ function testSecondaryMenu() { /** @var \Drupal\menu_link\MenuTreeInterface $menu_tree */ $menu_tree = \Drupal::service('menu_link.tree'); $tree = $menu_tree->buildTree('account'); - $this->assertEqual(count($tree), 1, 'The secondary links menu contains only one menu link.'); - $link = reset($tree); - $link = $link['link']; - $this->assertTrue((bool) $link->hidden, 'The menu link is hidden.'); + $this->assertEqual(count($tree), 0, 'The secondary links menu contains no menu link.'); } /** diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 86b1fa7..c385cbc 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -731,16 +731,6 @@ function user_menu_breadcrumb_alter(&$active_trail, $item) { } /** - * Implements hook_translated_menu_link_alter(). - */ -function user_translated_menu_link_alter(MenuLink &$menu_link) { - // Hide the "User account" link for anonymous users. - if ($menu_link->machine_name == 'user.page' && \Drupal::currentUser()->isAnonymous()) { - $menu_link->hidden = 1; - } -} - -/** * Try to validate the user's login credentials locally. * * @param $name diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml index 55c57d1..5f3c9ce 100644 --- a/core/modules/user/user.routing.yml +++ b/core/modules/user/user.routing.yml @@ -127,9 +127,9 @@ user.page: path: '/user' defaults: _content: '\Drupal\user\Controller\UserController::userPage' - _title: 'Log in' + _title: 'My account' requirements: - _access: 'TRUE' + _user_is_logged_in: 'TRUE' user.view: path: '/user/{user}' diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml index 1e8f9b3..1c1a1c5 100644 --- a/core/modules/user/user.services.yml +++ b/core/modules/user/user.services.yml @@ -40,6 +40,11 @@ services: class: Drupal\user\EventSubscriber\MaintenanceModeSubscriber tags: - { name: event_subscriber } + user_access_denied_subscriber: + class: Drupal\user\EventSubscriber\AccessDeniedSubscriber + arguments: ['@current_user', '@url_generator'] + tags: + - { name: event_subscriber } theme.negotiator.admin_theme: class: Drupal\user\Theme\AdminNegotiator arguments: ['@current_user', '@config.factory', '@entity.manager', '@router.admin_context']