首页 > 解决方案 > 有没有办法在 symfony 5 上通过防火墙设置登录超时?

问题描述

我需要能够为我拥有的每个防火墙设置不同的登录超时。

我怎样才能做到这一点?我只能为整个应用程序设置 cookie 生命周期,而不仅仅是社交防火墙处理的部分。此外,我找不到任何文档来通过防火墙分隔 cookie 的生命周期。还有其他方法吗?

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

标签: phpsymfonysymfony-securitysymfony5

解决方案


这是我将如何做到的:

创建覆盖 GuardAuthenticators 的自定义类,例如:

MyApiFirewallGuard extends App\Security\TokenAuthenticator

MyMainFirewallGuard extends App\Security\LoginFormAuthenticator

等等

然后,在您的 security.yaml 文件中使用这些类,您可能还必须将它们注册为服务以确保它们接收正确的构造参数。

现在在文档中您可以看到一些关于手动身份验证的信息:

https://symfony.com/doc/current/security/guard_authentication.html#manually-authenticating-a-user

这部分很有趣:

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;
    }

在这里,您有一个会话,因此您可以执行自己的会话超时逻辑。覆盖的 GuardAuthenticators 内可能还有其他钩子/位置,它们也允许进一步将行为更改为您需要的行为。


推荐阅读