Same filename and directory in other branches
- 8.9.x core/modules/user/src/Authentication/Provider/Cookie.php
- 9 core/modules/user/src/Authentication/Provider/Cookie.php
Namespace
Drupal\user\Authentication\Provider
File
core/modules/user/src/Authentication/Provider/Cookie.php
View source
<?php
namespace Drupal\user\Authentication\Provider;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Authentication\AuthenticationProviderInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Session\UserSession;
use Drupal\Core\Session\SessionConfigurationInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class Cookie implements AuthenticationProviderInterface, EventSubscriberInterface {
use StringTranslationTrait;
protected $sessionConfiguration;
protected $connection;
protected $messenger;
public function __construct(SessionConfigurationInterface $session_configuration, Connection $connection, MessengerInterface $messenger) {
$this->sessionConfiguration = $session_configuration;
$this->connection = $connection;
$this->messenger = $messenger;
}
public function applies(Request $request) {
$applies = $this->sessionConfiguration
->hasSession($request);
if (!$applies && $request->query
->has('check_logged_in')) {
$domain = ltrim(ini_get('session.cookie_domain'), '.') ?: $request
->getHttpHost();
$this->messenger
->addMessage($this
->t('To log in to this site, your browser must accept cookies from the domain %domain.', [
'%domain' => $domain,
]), 'error');
}
return $applies;
}
public function authenticate(Request $request) {
return $this
->getUserFromSession($request
->getSession());
}
protected function getUserFromSession(SessionInterface $session) {
if ($uid = $session
->get('uid')) {
$values = $this->connection
->query('SELECT * FROM {users_field_data} [u] WHERE [u].[uid] = :uid AND [u].[default_langcode] = 1', [
':uid' => $uid,
])
->fetchAssoc();
if (!empty($values) && $values['status'] == 1) {
$rids = $this->connection
->query('SELECT [roles_target_id] FROM {user__roles} WHERE [entity_id] = :uid', [
':uid' => $values['uid'],
])
->fetchCol();
$values['roles'] = array_merge([
AccountInterface::AUTHENTICATED_ROLE,
], $rids);
return new UserSession($values);
}
}
return NULL;
}
public function addCheckToUrl(ResponseEvent $event) {
$response = $event
->getResponse();
if ($response instanceof RedirectResponse) {
if ($event
->getRequest()
->getSession()
->has('check_logged_in')) {
$event
->getRequest()
->getSession()
->remove('check_logged_in');
$url = $response
->getTargetUrl();
$options = UrlHelper::parse($url);
$options['query']['check_logged_in'] = '1';
$url = $options['path'] . '?' . UrlHelper::buildQuery($options['query']);
if (!empty($options['fragment'])) {
$url .= '#' . $options['fragment'];
}
if ($response instanceof TrustedRedirectResponse) {
$response
->setTrustedTargetUrl($url);
}
$response
->setTargetUrl($url);
}
}
}
public static function getSubscribedEvents() : array {
$events[KernelEvents::RESPONSE][] = [
'addCheckToUrl',
-1000,
];
return $events;
}
}
Classes
Name |
Description |
Cookie |
Cookie based authentication provider. |