无法使用 Symfony 4 注销

Cannot logout with Symfony 4

我无法注销用户。

我将自定义用户管理逻辑移植到了 Symfony 4 项目中。它使用 securityguard 的配方。

这是我的主防火墙中的 logout 配置:

    logout:
        path: /logout
        target: /

结果: - 用户去/logout - 用户被重定向到/ - is_granted("IS_AUTHENTICATED_REMEMBERED") 在我的模板中继续 return true(预计 false

其他注意事项: - 防火墙条目被触发,因为如果我删除它会出现错误 - 我已经尝试向 logout 添加额外的参数来销毁会话和 cookie,但这没有任何区别 - 登录正常

知道如何解决这个问题吗?

:: 编辑 - 根据要求添加 security.yaml::

security:
    encoders:
        App\Entity\User: bcrypt
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN
    providers:
        app_users:
            entity: { class: App\Entity\User, property: email }
        app_oauth:
            id: app.oauth_user_provider
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            provider: app_users
            anonymous: ~
            oauth:
                resource_owners:
                    google: "/login/check-google"
                default_target_path: /
                login_path: /
                failure_path: /login
                oauth_user_provider:
                    service: app.oauth_user_provider
            remember_me:
                secret: "%env(APP_SECRET)%"
                lifetime: 2592000
                path:  /
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
                entry_point: App\Security\LoginFormAuthenticator
            logout:
                path: /logout
                target: /
            switch_user: ~

检查 App\Entity\User 中字段 $this->emailserializeunserialize 方法。

添加这些命令

在security.yaml

logout:
                path:   /logout
                target: /
                invalidate_session: true

在控制器中

    /**
     * @Route("/logout", name="logout")
     */
    public function logout()
    {

    }

在注销按钮中

<a class="text-muted" href="{{ path('logout') }}">logout </a>

看我对同样问题的回答

我将重复对我有用的内容:

如果您按照 Symfony Security Logging Out 中的说明进行操作,请确保使用正确的路由名称到达 /logout。我必须使用 'app_logout' 才能真正让它注销,而且我无法在不修改控制器注释的情况下更改 Security.yaml 文件中的路径名(见下文)。无需控制器。不需要自定义处理程序(谢天谢地)。

配置注销后,尝试 运行 php bin/console debug:router 检查到 /logout 的实际路由。

我的 Security.yaml 的注销部分如下所示:

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

根据说明,我添加了一个空控制器(如果您想要自定义路径名,您必须在此处更改路径名并将更改添加到 Security.yaml):

<?php

//App/Controller/SecurityController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class SecurityController extends AbstractController
{
    /**
     * @Route("/logout", name="app_logout")
     */
    public function logout()
    {
        throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
    }
}

我的电话是这样的:

<a class="nav-link" href="{{ path('app_logout') }}">Logout</a>