[英]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.