Laravel中的未加密cookie

20

我需要在JS中读取由我的Laravel应用程序设置的cookie。有没有一种方法可以在Laravel中做到这一点(而不是直接通过PHP进行设置),而无需覆盖类?


不,前端无法解密它们。使它们可以被前端访问的唯一方法是通过默认的php方法进行设置。 - Jeemusu
2
为什么不将它们作为变量传递给视图呢?或者,如果你需要它是一个JS变量,你可以使用Laravel包将变量传递到window全局变量,或者你可以通过AJAX调用请求它们。 - naneri
2个回答

61

请查看EncryptCookies中间件 - 它允许您设置例外,即不需要加密的cookie。

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;

class EncryptCookies extends BaseEncrypter
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        'my_cookie'
    ];
}

谢谢,就是这样了...我一直在想为什么我的 cookies 是纯文本 :D - dv02
尝试使用laravel_session cookie,但它仍然被加密。 - Herokiller
扩展中间件是实现这一目标的唯一方式吗?EncryptCookies 暴露了一个 disableFor 方法来修改 except 属性,但我不确定应该在哪个时刻调用该方法。 - Bower
@Bower,伙计你的问题已经得到解答,尽管有点晚了。 - ssi-anik
@ssi-anik,感谢您概述了实现该目标的技术! - Bower

1

已接受的答案完全没问题。

但是,我正在编写与@Bower评论中指出的相同事物的其他方法。由于这是一种冗长的方法,而不是在评论中放置,我正在编写一个完整的答案。

要使用disableFor方法执行相同的操作,可以按照以下任何方法之一进行操作。

  • 您可以在服务容器中注册EncryptCookies。并在实例化后调用disableFor

// use App\Http\Middleware\EncryptCookies;
// use Illuminate\Contracts\Encryption\Encrypter;

$this->app->bind(EncryptCookies::class, function ($app) {
    return tap(new EncryptCookies($app->make(Encrypter::class)), function ($middleware) {
        $middleware->disableFor('laravel_session');
    });
});

您可以使用服务容器的 afterResolving 事件。
$this->app->afterResolving(EncryptCookies::class, function ($middleware) {
    $middleware->disableFor('laravel_session');
});

而且,这两种方法都是违反直觉的,根本没有任何意义。在我的看法中,它们都增加了隐藏代码复杂性,而这些代码通常在调试时不会被查看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接