簡體   English   中英

無法在 Symfony4 中注銷用戶

[英]Can't Logout user in Symfony4

我正在將使用 Symfony2.7 構建的項目更新到 Symfony4,一切正常並且具有良好的兼容性,但是應該沒問題的一件事,內置資源,安全層,無法按預期工作。

我面臨的問題是我無法再注銷用戶。 我按照 指南上的步驟操作,但沒有任何改變。

下面是安全配置:

#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

同樣,它是配方自己創建的配置。

您需要在控制器中刪除注銷操作,
接下來將路由添加到config/routes.yaml

更多信息在這里。
https://symfony.com/doc/current/security.html#logging-out

我通過使用 **LogoutSuccessHandler*( 參考)刪除REMEMBERME cookie 來實現注銷的結果。

我認為這是一個丑陋的解決方法,但結果令人滿意,因為一切正常。 但仍然不知道為什么它不能與配置一起自動工作,也不知道為什么我不能使用自定義注銷處理程序。 如果有人提出更好的答案,我可以將其標記為已接受的答案。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM