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