Как построить автоматическую авторизацию при входе на сайт?
Добрый день.
Требуется построить автоматическую авторизацию при входе на сайт с Symfony 5 без формы регистрации. Сайт крутится на IIS, и текущий логин пользователя будет находиться в переменной $_SERVER['AUTH_USER']. Вот этот логин и нужно использовать. Как такое можно соорудить?
Но мне нужна была именно не только аутентификация, но и авторизация, а все роли лежат в БД. Но я нашел решение для автоматического входа произвольного пользователя без формы авторизации. Если кому будет интересно, могу поделиться. :-)
У меня настроена авторизация по email. Тестовый контроллер прописан так:
<?php
// src/Controller/SomeController.php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Symfony\Component\EventDispatcher\EventDispatcher;
class SomeController extends AbstractController
{
/**
* @Route("/", name="app_homepage")
*/
public function index( Request $request )
{
$this -> autologin( "admin@mail.ru", $request );
return $this->render('base.html.twig');
}
public function autologin( $email, $request )
{
$dispatcher = new EventDispatcher();
$user = $this->getDoctrine()->getManager()->getRepository("App\Entity\User")->findOneBy(['email' => $email ]);
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main', serialize($token));
$event = new InteractiveLoginEvent($request, $token);
$dispatcher->dispatch($event);
}
}
Наводку на код нашел в сети, но там было под Symfony 4. У меня Symfony 5, допилил, может кому, чем поможет, хотя-бы идеологически :-D. Мой класс User устроен по нужной нам модели, метод getRoles там переписан, но это - детали реализации. Попробовал это вынести в сервисный слой, работает. От такого решения отдает "костылями", но я и с Symfony знаком лишь месяц. :-)