Php Laravel cookies附带加密功能,为什么?

Php Laravel cookies附带加密功能,为什么?,php,laravel,laravel-5.5,Php,Laravel,Laravel 5.5,我得到了以下服务提供商: class CartServiceProvider extends ServiceProvider { public function boot() { } public function register() { $this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) { return new \Alexxos

我得到了以下服务提供商:

class CartServiceProvider extends ServiceProvider {
    public function boot() {

    }

    public function register() {
        $this->app->singleton(\Alexxosipov\Cart\Cart::class, function($app) {
            return new \Alexxosipov\Cart\Cart($app['request']);
        });
    }
}
还有我的购物车课,我在那里得到了这个:

$this->id = (request()->cookie('cart_id')) ? request()->cookie('cart_id') : false;
但是请求->cookie'cart\u id'返回加密字符串。如果我在任何一个控制器中都能做到这一点,那么它工作得很好。为什么?我应该怎么做才能在Cart类中使用它?Laravel 5.5

为什么?Cookie加密保护存储在客户端浏览器中的数据

How:Laravel使用EncryptCookies中间件,当您的服务提供商注册时,还不会处理该中间件,但会为控制器处理该中间件,因为在将请求传递给控制器之前,中间件位于路由堆栈中


因为我不知道您的cart类及其逻辑,所以我不能真正推荐您应该做什么。也许您需要考虑何时将请求对象传递给类。

Laravel引导请求的顺序是v5.6:CMIIW

php被称为 \已创建照明\基础\应用程序 HttpKernel已注册。这是注册你的中间产品 控制台内核已注册。这定义了控制台命令 已注册异常处理程序。这定义了异常处理程序 HttpKernel已实例化。这将实例化所有中间件,并启动/注册所有服务提供商 创建全局请求实例。将其传递给HttpKernel以处理传入的请求。 中间件加密cookies调用,cookies解密 向其他中间件发送请求以进行处理 向路由器发送请求,向控制器发送路由器调度 ... 在向浏览器发送响应之前,Cookie会在EncryptCookie中重新加密 Cookie在步骤1-步骤7中保持加密状态。您的CartServiceProvider正在尝试获取尚未在步骤6解密的cookie,这是不可能的。考虑一下

自己使用just Decrypt解密cookie,或

创建一个中间件,在加密Cookie后实例化购物车。在引导服务提供者阶段实例化cart有点为时过早

编辑:添加单例建议

我认为你可以这样做:

在Cart::类中创建名为loadCartFromRequest$request的新方法。此方法可帮助您在中间件阶段从请求加载购物车实例

在您的CartServiceProvider中,您可以像往常一样注册一个Cart::class单例,但不需要在此处读取请求

创建一个中间件,称为CartMiddleware。此中间件调用appCart::class->loadCartFromRequest$request

然后,在需要购物车实例的任何其他位置,您可以从appCart::class访问购物车模型


我希望我正确理解您的要求:

我使用了Laravel 5.2,它很好。我的cart类非常简单:在构造中,我们检查cart_id cookie并从数据库中获取一行cart。这就是:$This->id=request->cookie'cart\u id'?请求->cookie'cart\u id':false;如果返回false,我们将为此用户设置新购物车。我试图将$request变量传递给_构造,但它仍然是一样的:Cookie加密保护存储在客户端浏览器中的数据。你能澄清一下吗?据我所知,加密cookie只会防止信息泄露——用户和其他人无法阅读/理解cookie的内容和语义,并用于验证cookie的完整性。如果攻击者截获带有加密cookie的请求,则加密将无效。你认为呢?如果攻击者没有加密密钥,数据就没有用处,因为是服务器端解密cookie的内容。那么,我应该创建一个新的中间件并从register方法复制代码吗?或者如何使用中间件在服务容器中创建一个新的单例?@Alexosipov补充了一个建议