Polska Społeczność Symfony - Forum

Framework => Pomoc => Wątek zaczęty przez: eerie w Sierpnia 19, 2018, 13:33:39

Tytuł: Automatycznie wykonywana usługa
Wiadomość wysłana przez: eerie w Sierpnia 19, 2018, 13:33:39
Mam taki kod na początku każdego kontrolera:

$config = new Config();
$session = $request->getSession();
$em = $this->getDoctrine()->getManager();
$cookieLogin = new CookieLogin($em, $config);
$cookieLogin->setCookieLogin($session);

Pozawala mi to sprawdzić w sesji, czy jest zalogowany użytkownik. Jeśli nie jest, to loguje go na podstawie ciasteczka, jeśli takie zostało utworzone przy logowaniu.

Moje pytanie. Czy da się utworzyć usługę, która automatycznie wykona mi ten kod bez konieczności umieszczania go i wywoływania w każdym kontrolerze z osobna?

Pozdrawiam
Robert
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: eerie w Sierpnia 21, 2018, 18:01:56
Zrobiłem to tak:

<?php declare(strict_types=1);

// src/Controller/ListenActionController.php
namespace App\Controller;

use 
App\Bundle\{ConfigCookieLogin};
use 
Doctrine\ORM\EntityManagerInterface;
use 
Symfony\Bundle\FrameworkBundle\Controller\Controller;
use 
Symfony\Component\HttpKernel\Event\FilterControllerEvent;

class 
ListenActionController extends Controller
{
    protected 
$em;

    public function 
__construct(EntityManagerInterface $em)
    {
        
$this->em $em;
    }

    public function 
onKernelController(FilterControllerEvent $event)
    {
        
$config = new Config();
        
$request $event->getRequest();
        
$session $request->getSession();
        
$cookieLogin = new CookieLogin($this->em$config);
        
$cookieLogin->setCookieLogin($session);
    }
}

W services.yaml ustawiłem:

services:
    app.listener:
        class: App\Controller\ListenActionController
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

Skorzystałem z ustawienia autowire: true w Symfony 4 i automatycznie wstrzykuje mi zależności:

services:
    _defaults:
        autowire: true
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: Valantir w Sierpnia 27, 2018, 13:17:31
Źle się za to chyba zabierasz. Do samego logowania powinieneś napisać tzw. Providera:

https://symfony.com/doc/current/security/custom_authentication_provider.html (https://symfony.com/doc/current/security/custom_authentication_provider.html)

Ewentualnie skorzystać z jakichś gotowych rozwiązań.
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: eerie w Sierpnia 31, 2018, 13:37:51
Na innym forum ktoś mi wskazał, że rozwiązaniem mojego problemu jest Middleware:

https://silex.symfony.com/doc/2.0/middlewares.html

Wtedy znalazłem w Google to:

https://stackoverflow.com/questions/11275328/symfony2-middleware
https://symfony.com/doc/current/event_dispatcher/before_after_filters.html

Pozdrawiam
Robert
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: Valantir w Sierpnia 31, 2018, 13:58:08
Ja tu mówię o samym mechanizmie logowania. Że sam zapisujesz do sesji itp.
Spójrz jeszcze tutaj:

https://symfony.com/doc/current/security/form_login_setup.html

Jeśli mimo wszystko chcesz zaimplementować to o czym piszesz, to tak, powinieneś nasłuchiwać wykonania akcji kontrolera w ten sposób:

https://symfony.com/doc/current/event_dispatcher/before_after_filters.html#tag-controllers-to-be-checked

Pamiętaj, zeby wybrać odpowiednią wersję dokumentacji
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: eerie w Sierpnia 31, 2018, 16:11:10
To ja jeszcze dopytam... Znaczy to, iż przechowywanie id zalogowanego użytkownika oraz jego uprawnień dostępu w sesji to nie jest bezpieczne rozwiązanie?

Jak unieważni się sesja, to czytam na nowo z cookie, jeśli jest utworzone przy logowaniu. Tak to wygląda na chwilę obecną:

https://github.com/webeeq/sieciq2.eeq/blob/master/src/Bundle/CookieLogin.php
https://github.com/webeeq/sieciq2.eeq/blob/master/src/Controller/ListenEventController.php
https://github.com/webeeq/sieciq2.eeq/blob/master/config/services.yaml

Pozdrawiam
Robert
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: Valantir w Września 01, 2018, 16:29:07
Zainstaluj sobie bundle'a np. FOSUserBundle i masz zaimplementowane logowanie, rejestracje, resetowanie hasła w jednym bundle'u.
Tytuł: Odp: Automatycznie wykonywana usługa
Wiadomość wysłana przez: eerie w Września 28, 2018, 11:59:55
Zainstalowałem FOSUserBundle i przerobiłem stronę. Tak to wygląda teraz:

https://github.com/webeeq/sieciq3.eeq

Pozdrawiam
Robert