Есть ли способ установить время ожидания входа в систему через брандмауэр на symfony 5? - PullRequest
1 голос
/ 29 марта 2020

Мне нужно иметь возможность установить различное время ожидания входа для каждого имеющегося у меня брандмауэра.

Как я могу это сделать? Я могу установить время жизни cook ie только для всего приложения, а не только для части, обрабатываемой социальным брандмауэром. Кроме того, я не могу найти никакой документации, чтобы отделить время жизни повара ie с помощью брандмауэра Есть ли другой способ сделать это?

Я использую PdoSessionHandler в качестве обработчика сеанса:

App\Config\Package\security.yaml:

security:
    # ... #
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false

        api:
            anonymous: lazy
            provider: social_user_provider
            pattern: ^/app

            logout:
                path: social_logout
                target: social_redirect_after_logout

            guard:
                authenticators:
                    - App\Security\TokenAuthenticator

            remember_me:
                secret:   '%kernal.secret'
                lifetime: 3600 # 1 hour
                path:     /

        main:
            anonymous: lazy
            provider: app_user_provider

            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator

            logout:
                path: app_logout
                # where to redirect after logout
                target: app_login

            remember_me:
                secret:   '%kernel.secret%'
                lifetime: 604800 # 1 week in seconds
                path:     /

        # ... #

App\Config\services.yaml:

services:

    # ... #
    # Sessions handler
    Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler:
        arguments:
            - 'mysql:dbname=%env(resolve:DATABASE_NAME)%; host=%env(resolve:DATABASE_HOST)%; port=%env(resolve:DATABASE_PORT)%'
            - { db_username: '%env(resolve:DATABASE_USER)%', db_password: '%env(resolve:DATABASE_PASSWORD)%' }

App\Config\Packages\framework.yaml

framework:
    # ... #
    session:
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        cookie_secure: auto
        cookie_samesite: lax

1 Ответ

0 голосов
/ 13 апреля 2020

Вот как я бы это сделал:

Создание пользовательских классов, переопределяющих GuardAuthenticators, например:

MyApiFirewallGuard extends App\Security\TokenAuthenticator

MyMainFirewallGuard extends App\Security\LoginFormAuthenticator

et c.

Затем, используйте эти классы в своем файле security.yaml, возможно, вам также придется зарегистрировать их как сервисы, чтобы убедиться, что они получают правильные параметры построения.

Теперь в документации Вы можете увидеть немного о ручной аутентификации:

https://symfony.com/doc/current/security/guard_authentication.html#manually -аутентификация пользователя

Эта часть интересна:

public function supports(Request $request)
    {
+         // if there is already an authenticated user (likely due to the session)
+         // then return false and skip authentication: there is no need.
+         if ($this->security->getUser()) {
+             return false;
+         }

+         // the user is not logged in, so the authenticator should continue
+         return true;
    }

Здесь у вас есть сеанс, и, таким образом, вы можете сделать свой собственный журнал тайм-аута сеанса c. Внутри переопределенных GuardAuthenticators могут быть другие хуки / места, которые также позволяют дополнительно изменить поведение в соответствии с вашими потребностями.

...