无法在 Symfony4 中注销用户
Can't Logout user in 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
同样,它是自己创建的配方配置。
您需要在控制器中删除注销操作,
接下来将路由添加到 config/routes.yaml
.
这里有更多信息。
https://symfony.com/doc/current/security.html#logging-out
我通过使用 **LogoutSuccessHandler* (reference).
删除 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>
我正在将一个用 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
同样,它是自己创建的配方配置。
您需要在控制器中删除注销操作,
接下来将路由添加到 config/routes.yaml
.
这里有更多信息。
https://symfony.com/doc/current/security.html#logging-out
我通过使用 **LogoutSuccessHandler* (reference).
删除 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>