php – 从Symfony2中的http_basic身份验证注销

每当我进入/ 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,这将认为身份验证失败导致身份验证缓存被清除(无论如何,谁想要记住错误的凭据)并再次提示您的凭据

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...