Приклади проксі сесії

Дата оновлення перекладу 2022-12-23

Приклади проксі сесії

Механізм проксі сесії має багато застосувань, і ця стаття демонструє два найбільш розповсюджених. Замість того, щоб використовувати звичайний обробник сесій, ви можете створити користувацький, просто визначивши клас, що розширює клас SessionHandlerProxy.

Після цього, визначіть клас як сервіс . Якщо ви використовуєте конфігурацію services.yml за замовчуванням , це станеться автоматично.

Нарешті, використайте опцію конфігурації framework.session.handler_id, щоб вказати Symfony використовувати ваш обробник сесії, замість встановленого за замовчуванням:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/framework.yaml
framework:
    session:
        # ...
        handler_id: App\Session\CustomSessionHandler

Продовжуйте читати наступний розділ, щоб дізнатися, як використовувати обробники сесій на практиці, щоб розвʼязувати два найрозповсюдженіших випадки використання: шифрування інформації сесії та визначення гостьових сесій тільки для читання.

Шифрування даних сесії

Якщо ви хочете зашифрувати дані сесії, ви можете використати проксі, щоб шифрувати та дешифрувати сесію, як це вимагається. Наступний приклад використовує бібліотеку php-encryption, але ви можете адаптувати його до будь-якої іншої бібліотеки, яку ви використовуєте:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// src/Session/EncryptedSessionProxy.php
namespace App\Session;

use Defuse\Crypto\Crypto;
use Defuse\Crypto\Key;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;

class EncryptedSessionProxy extends SessionHandlerProxy
{
    private $key;

    public function __construct(\SessionHandlerInterface $handler, Key $key)
    {
        $this->key = $key;

        parent::__construct($handler);
    }

    public function read($id)
    {
        $data = parent::read($id);

        return Crypto::decrypt($data, $this->key);
    }

    public function write($id, $data)
    {
        $data = Crypto::encrypt($data, $this->key);

        return parent::write($id, $data);
    }
}

Гостьові сесії тільки для читання

Існують додатки, де сесія необхідна для гостьових користувачів, але де немає необхідності зберігати сесію. У такому випадку, ви можете перервати сесію до того, як вона буде записана:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// src/Session/ReadOnlySessionProxy.php
namespace App\Session;

use App\Entity\User;
use Symfony\Bundle\SecurityBundle\Security\Security;
use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;

class ReadOnlySessionProxy extends SessionHandlerProxy
{
    private $security;

    public function __construct(\SessionHandlerInterface $handler, Security $security)
    {
        $this->security = $security;

        parent::__construct($handler);
    }

    public function write($id, $data)
    {
        if ($this->getUser() && $this->getUser()->isGuest()) {
            return;
        }

        return parent::write($id, $data);
    }

    private function getUser()
    {
        $user = $this->security->getUser();
        if (is_object($user)) {
            return $user;
        }
    }
}