无法在Symfony4中注销用户

时间:2018-01-11 13:39:17

标签: php symfony security logout symfony4

我正在将使用Symfony2.7构建的项目更新到Symfony4,一切正常并且具有良好的兼容性,但有一点应该没问题,内置资源,安全层,不能按预期工作

我面临的问题是我无法再注销用户。我按照guide上的步骤进行了操作,但没有任何改变。

以下是安全配置:

#config/packages/security.yaml
security:
    encoders:
        App\Entity\Clients:
            algorithm: bcrypt

    providers:
        app_user_provider:
            entity:
                class: App\Entity\Clients
    firewalls:    
        app:
            pattern: ^/
            anonymous: ~
            provider: app_user_provider
            remember_me:
                secret: "%kernel.secret%"
            form_login:
                use_referer: true
                login_path: login
                check_path: login_check
                always_use_default_target_path: false
                default_target_path: dashboard
                csrf_token_generator: security.csrf.token_manager
            logout:
                path: logout
                target: home
                invalidate_session: false

我使用的路径是路由名称,但也尝试了路径本身。

我通常可以登录任何用户,但是当我点击退出路线时,我只是被重定向到主路线,但用户仍然经过身份验证。

尝试设置自定义处理程序注销,如:

logout:
    handlers: [logout_handler]

它引用了一个实现 Symfony \ Component \ Security \ Http \ Logout \ LogoutHandlerInterface 的服务,但它甚至没有调用处理程序。

如果我只能使用默认处理程序,那将是很好的,并且有必要保持“remember_me”行为,这在2.7中工作正常。

有人可以帮我吗?

编辑:我的配置routes.yaml为空,因为我正在使用注释路由,config / packages / routing.yaml如下:

framework:
    router:
        strict_requirements: ~

就像使用 composer create-project 命令初始化一样。 对于注释配置,我有文件config / routes / annotations.yaml:

controllers:
    resource: ../../src/Controller/
    type: annotation

同样,它是配方自己创建的配置。

3 个答案:

答案 0 :(得分:0)

您需要删除控制器中的注销操作,
接下来添加路由到config/routes.yaml

此处有更多信息。
https://symfony.com/doc/current/security.html#logging-out

答案 1 :(得分:0)

我通过使用** LogoutSuccessHandler *(reference)删除 REMEMBERME Cookie来实现注销结果。

我认为这是一个丑陋的解决方法,但结果令人满意,因为一切正常。但仍然不知道为什么它没有自动使用配置,也是为什么我不能使用自定义注销处理程序。如果有人提出更好的答案,我可以将其标记为已接受的答案。

答案 2 :(得分: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>