drupalauth4ssp-8.x-1.1/src/EventSubscriber/DrupalAuthForSSPSubscriber.php

src/EventSubscriber/DrupalAuthForSSPSubscriber.php
<?php

namespace Drupal\drupalauth4ssp\EventSubscriber;

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Url;
use Drupal\drupalauth4ssp\SspHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * DrupalAuth for SimpleSAMLphp event subscriber.
 */
class DrupalAuthForSSPSubscriber implements EventSubscriberInterface {

  /**
   * Account proxy.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $accountProxy;

  /**
   * SimpleSamlPHP handler service.
   *
   * @var \Drupal\drupalauth4ssp\SspHandler
   */
  protected $sspHandler;

  /**
   * Constructs event subscriber.
   *
   * @param \Drupal\Core\Session\AccountProxyInterface $account_proxy
   *   Account proxy.
   * @param \Drupal\drupalauth4ssp\SspHandler $sspHandler
   *   SimpleSamlPHP handler service.
   */
  public function __construct(AccountProxyInterface $account_proxy, SspHandler $sspHandler) {
    $this->accountProxy = $account_proxy;
    $this->sspHandler = $sspHandler;
  }

  /**
   * Check if redirect destination is set by the drupalauth4ssp_user_logout().
   *
   * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
   *   Response event.
   */
  public function checkRedirection(ResponseEvent $event): void {
    if ($event->getResponse() instanceof RedirectResponse) {
      $response = $event->getResponse();
      $path = $response->getTargetUrl();
      $frontPage = Url::fromRoute('<front>')->setAbsolute()->toString();

      // Redirect after log out.
      $responseIsHttpFound = $response->getStatusCode() === Response::HTTP_FOUND;
      $isRedirectToFrontPage = ($path === $frontPage && $responseIsHttpFound);
      $destination = &drupal_static('drupalauth4ssp_user_logout');
      if ($isRedirectToFrontPage && !empty($destination)) {
        $response->setTargetUrl($destination);
        $event->stopPropagation();
      }
    }
  }

  /**
   * Save account ID into SimpleSAMLphp state.
   *
   * When user is authenticated by the cookie.
   *
   * @param \Symfony\Component\HttpKernel\Event\ResponseEvent $event
   *   Response event.
   */
  public function saveIdToState(ResponseEvent $event): void {
    if ($event->getResponse() instanceof RedirectResponse) {
      $response = $event->getResponse();
      $responseIsHttpFound = $response->getStatusCode() === Response::HTTP_FOUND;
      $returnTo = $event->getRequest()->query->get('ReturnTo');
      $isLoginRequest = $event->getRequest()->attributes->get('_route') === 'user.login';
      // If this was request to login and user was authenticated by the cookie,
      // and we have a returnTo URL.
      if ($isLoginRequest && $responseIsHttpFound && $returnTo) {
        $request = Request::create($returnTo);
        if ($stateId = $request->query->get('State')) {
          $this->sspHandler->saveIdToStat($this->accountProxy->id(), $stateId);
        }
        $response->setTargetUrl($returnTo);
        $event->stopPropagation();
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      KernelEvents::RESPONSE => [['checkRedirection'], ['saveIdToState']],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc