在一个响应中设置并检查Cookie - Laravel

时间:2015-04-23 23:48:00

标签: php laravel cookies laravel-4

我正在尝试设置Cookie,然后检查Cookie是否已设置。

所以在一个函数中,我让它制作了cookie:

public function makeCookies(){
    Cookie::queue('logged_in', $value, 15);
    Cookie::queue('user_id', 2);
    //return Response::make()->withCookie(Cookie::make('logged_in', $value, 15))->withCookie(Cookie::forever('user_id', 2));
}

在另一个函数中,我尝试检查cookie是否已设置:

public function checkCookies(){
         $this->makeCookies();
         if(Cookie::get('logged_in') && Cookie::get('user_id')){
              return 'Logged In!';
         }
}

然而,唯一可行的方法是,如果我添加' return'在$ this-> makeCookies()之前;但是,我希望能够达到它下面的条件。我有什么办法可以做到这一点吗?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

了解Cookie创建/读取过程:

  1. 用户的浏览器发送页面请求以及当前为该网站提供的任何Cookie
  2. 该网站会提供该页面,您创建的所有Cookie都会成为您回复中的标题。
  3. 对您网站的后续请求将发送在#2中创建的Cookie。
  4. 您要问的是......能够阅读您在步骤#1中步骤2中创建的Cookie ...不可能。

    现在,根据Cookie类的创建方式,您可以将其设置为在调用Cookie :: queue()时创建内存数据,以反映cookie"应该是什么&# 34;在下一个请求中,但它并不真正知道用户的浏览器是否会接受cookie等。

    这就是为什么许多网站在创建cookie后会让用户重定向到某个页面,例如?checkCookie = 1。通过这种方式,在后续请求中,他们可以验证您的浏览器是否支持cookie ...如果cookie不存在于?checkCookie页面上,他们会给出错误,说明他们的站点需要cookie支持。但是,它需要第二轮到服务器才能从浏览器中读取已创建的cookie。

    更新2015-04-24 对于@Scopey,Laravel确实通过queued()支持内存中检索cookie。所以,你应该能够做到:

    public function checkCookies(){
        $this->makeCookies();
        $loggedIn = Cookie::get('logged_in') ?: Cookie::queued('logged_in');
        $userId   = Cookie::get('user_id') ?: Cookie::queued('user_id');
        if( $loggedIn && $userId ){
            return 'Logged In!';
        }
    }
    

    安全问题(不直接回答问题)

    你的问题只是关于cookies,所以我回答了所有问题。但是,现在我正在查看你的代码,我觉得我不应该为那些碰巧正在读这篇文章的人指出这一点。这可能只是一个"如何"对于你自己而不是生产代码,但如果代码公开,那么代码可能会非常危险。

    确保您不信任存储在Cookie中的user_id,以确定通过Cookie进入的用户。如果您依赖它,并且我来到您的网站,我可以将我的cookie修改为我想要的任何user_id并进入其他人的帐户。

    一般安全规则:

    Cookie应包含GUID或类似的随机字符串以标识会话。这个随机字符串应该足够长(例如32个字符或更大,恕我直言),以至于某人不容易蛮力劫持会话。

    user_id应存储在$ _SESSION(或laravel的会话包装中,如果适用),以便用户无法访问user_id以便能够修改它。

    在普通的PHP中,登录页面的内容如下:

    session_start();
    if( isValidPassword($_POST['username'], $_POST['password']) ) {
        $_SESSION['user_id'] = $user->Id;
    }
    else {
        die('invalid login credentials');
    }
    

    session_start()方法会自动为用户生成一个包含该长字符串的Cookie(因此您甚至不必担心该部分。)

    在后续页面中,您只需检查会话user_id以了解谁已登录:

    session_start();
    if( empty($_SESSION['user_id']) ) {
        die('You are not logged in and cannot access this page');
    }
    

    根据需要根据Laravel的文档进行更改,如果他们有自己的会话包装器,我确信已经在最佳实践中得到充分记录。

答案 1 :(得分:3)

@KevinNelson关于cookie的优秀描述,但Laravel支持取回您在当前请求中排队的任何cookie。尝试使用

Cookie::queued('logged_in');

问题是,cookie只会在您排队的请求中“排队”。您必须像对待任何其他请求一样使用get