每当我进入/ admin / logout时,我都被正确地重定向到我的项目的根目录,但是当我访问/ admin /时仍然登录,因为我没有提示输入凭据.
这是我的配置:
security.yml
security: firewalls: admin_area: pattern: ^/admin http_basic: ~ stateless: true switch_user: { role: ROLE_SUPER_ADMIN,parameter: _want_to_be_this_user } logout: { path: /admin/logout,target: / }
AdminBundle /资源/配置/ routing.yml中
logout: pattern: /logout
应用程序/配置/ routing.yml中
admin: resource: "@AdminBundle/Resources/config/routing.yml" prefix: /admin
授权仍然存在,因为标题状态为Authorization:Basic YWRtaW46cEAkJHcwUmQh所以我想在请求期间仍然会向应用程序提供凭据.
我知道根据this question没有正确的方法从HTTP Basic Auth注销但也许Symfony2允许它?
通过http auth登录后,您的浏览器将缓存并以标题的形式将登录凭据添加到每个后续请求中,如下所示:
Authorization:Basic YWRtaW46YWRtaW4=
当您注销时,对服务器的下一个请求仍将保留您的http凭据并再次登录.
因此,诀窍是在服务器端销毁会话后丢失客户端的http凭据.
在过去,有一些hackidy方法,如提交虚假凭据或一些模糊的IE方法来删除缓存.但我不认为这些方法仍然有效.
什么仍然有效(我使用symfony 2.7和谷歌浏览器45测试了以下方法)正在使用HTTP 401未经授权的响应回复客户端.
看看这个:
将以下内容添加到app / config / security.yml文件的注销部分
logout: success_handler: logout_listener
到您的服务配置app / config / services.yml
logout_listener: class: AppBundle\logoutListener
然后创建一个响应HTTP 401未授权的侦听器
<?PHP namespace AppBundle; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Http\logout\logoutSuccessHandlerInterface; class logoutListener implements logoutSuccessHandlerInterface { public function onlogoutSuccess(Request $request) { return new Response('',401); } }
注销后,您的应用程序将向浏览器发送401,这将认为身份验证失败导致身份验证缓存被清除(无论如何,谁想要记住错误的凭据)并再次提示您的凭据