我第一次遇到Symfony(2.7)身份验证问题,我真的找不到可行的解决方案。虽然Symfony有一个专用的配置选项 logout - > target ,这从未在注销时应用,我总是被定向到/。我可能错过了正确实现这一点的一些限制。
好的,我正在使用:
我的config.yml防火墙
secured_area:
pattern: ^/
stateless: false
form_login:
...
logout:
path: logout
target: /test
success_handler: logout_success_handler
anonymous: ~
为了测试,我甚至添加了
access_control:
- { path: ^/test, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
我使用路径的路由名称,路由存在且工作正常(我可以登录, login_check 和注销)。
我希望通过设置注销 - > target ,注销时我会被重定向到页面/测试。但无论我尝试过什么,直到现在我总是在退出时/之后。
我会很高兴,如果有人可以指出我正确的方向,如何退出自定义路线(我也尝试使用路线名称目标)。非常感谢!
顺便说一句:
我的logout_success_handler目前没有任何功能。通过启用转储,我也看到,重定向始终是/而不是/ test。
public function onLogoutSuccess(Request $request)
{
$response = parent::onLogoutSuccess($request);
//var_dump($response); die;
return $response;
}
答案 0 :(得分:1)
没有内置的退出目标。你必须在你的处理程序中处理它。
第1步
将您的退出目标放入参数文件
parameters:
logout.target: /test
第2步
将您已注销处理程序的service.yml
修改为以下内容:
some.logout_handler:
class: SomeBundle\Security\YourAuthenticationHandler
arguments: ["@security.context", %logout.target%]
这会将它注入你的处理程序。
第3步
最后,在您的onLogoutSuccess
方法中,只需执行
public function onLogoutSuccess(Request $request)
{
$response = parent::onLogoutSuccess($request);
return new RedirectResponse($this->logoutTarget);
}
答案 1 :(得分:0)
这是人们遇到同样问题的最终方法。
/**
* LogoutSuccessHandler
*/
class LogoutSuccessHandler extends DefaultLogoutSuccessHandler implements LogoutSuccessHandlerInterface
{
/**
* @var string
*/
private $logout_route;
/**
* Constructor
*
* @param RouterInterface $router
* @param EntityManager $em
*/
public function __construct(HttpUtils $httpUtils, $logoutRoute)
{
$this->logout_route = $logoutRoute;
parent::__construct( $httpUtils );
}
/**
* @param Request $request
* @return Response
*/
public function onLogoutSuccess(Request $request)
{
return $this->httpUtils->createRedirectResponse($request, $this->logout_route);
}
}
我想使用 httpUtils ,因为 createRedirectResponse 了解路径和路由名称。