无法使用Symfony 4

时间:2017-12-20 17:22:18

标签: symfony symfony4

我无法退出用户。

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

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

    logout:
        path: /logout
        target: /

结果: - 用户进入/注销 - 用户被重定向到/ - is_granted("IS_AUTHENTICATED_REMEMBERED")继续在我的模板中返回true(预计会false

其他考虑因素: - 防火墙条目被触发,因为如果我删除它会出错 - 我已尝试向logout添加其他参数以销毁会话和Cookie,但这没有任何区别 - 登录工作正常

有关如何解决这个问题的想法吗?

:: edit - 按要求添加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: ~

3 个答案:

答案 0 :(得分:2)

添加这些命令

在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>

答案 1 :(得分:1)

检查serialize中的unserialize$this->email字段App\Entity\User方法。

答案 2 :(得分:0)

请参阅我对相同问题的回答here

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

如果您按照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>