5

我无法注销用户。

我将自定义用户管理逻辑移植到 Symfony 4 项目中。security它使用和的食谱guard

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

    logout:
        path: /logout
        target: /

结果: - 用户转到 /logout - 用户被重定向到 / -is_granted("IS_AUTHENTICATED_REMEMBERED")继续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: ~
4

3 回答 3

6

添加这些命令

在 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>
于 2018-05-14T12:43:05.010 回答
1

检查 中的字段serializeunserialize方法。$this->emailApp\Entity\User

于 2018-03-06T15:09:44.497 回答
0

在这里查看我对同一问题的回答

我会重复对我有用的东西:

如果您按照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>
于 2019-11-05T02:30:55.940 回答