Autor Wątek: Automatycznie wykonywana usługa  (Przeczytany 595 razy)

eerie

  • Newbie
  • *
  • Wiadomości: 21
    • Zobacz profil
Automatycznie wykonywana usługa
« dnia: Sierpień 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

eerie

  • Newbie
  • *
  • Wiadomości: 21
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #1 dnia: Sierpień 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

Valantir

  • Hero Member
  • *****
  • Wiadomości: 580
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #2 dnia: Sierpień 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

Ewentualnie skorzystać z jakichś gotowych rozwiązań.

eerie

  • Newbie
  • *
  • Wiadomości: 21
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #3 dnia: Sierpień 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

Valantir

  • Hero Member
  • *****
  • Wiadomości: 580
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #4 dnia: Sierpień 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

eerie

  • Newbie
  • *
  • Wiadomości: 21
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #5 dnia: Sierpień 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

Valantir

  • Hero Member
  • *****
  • Wiadomości: 580
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #6 dnia: Wrzesień 01, 2018, 16:29:07 »
Zainstaluj sobie bundle'a np. FOSUserBundle i masz zaimplementowane logowanie, rejestracje, resetowanie hasła w jednym bundle'u.

eerie

  • Newbie
  • *
  • Wiadomości: 21
    • Zobacz profil
Odp: Automatycznie wykonywana usługa
« Odpowiedź #7 dnia: Wrzesień 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