无法使用 Symfony 4 注销
Cannot logout with Symfony 4
我无法注销用户。
我将自定义用户管理逻辑移植到了 Symfony 4 项目中。它使用 security
和 guard
的配方。
这是我的主防火墙中的 logout
配置:
logout:
path: /logout
target: /
结果:
- 用户去/logout
- 用户被重定向到/
- is_granted("IS_AUTHENTICATED_REMEMBERED")
在我的模板中继续 return 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: ~
检查 App\Entity\User
中字段 $this->email
的 serialize
和 unserialize
方法。
添加这些命令
在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>
看我对同样问题的回答
我将重复对我有用的内容:
如果您按照 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>
我无法注销用户。
我将自定义用户管理逻辑移植到了 Symfony 4 项目中。它使用 security
和 guard
的配方。
这是我的主防火墙中的 logout
配置:
logout:
path: /logout
target: /
结果:
- 用户去/logout
- 用户被重定向到/
- is_granted("IS_AUTHENTICATED_REMEMBERED")
在我的模板中继续 return 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: ~
检查 App\Entity\User
中字段 $this->email
的 serialize
和 unserialize
方法。
添加这些命令
在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>
看我对同样问题的回答
我将重复对我有用的内容:
如果您按照 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>