我正在尝试设置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()之前;但是,我希望能够达到它下面的条件。我有什么办法可以做到这一点吗?非常感谢任何帮助。
答案 0 :(得分:4)
了解Cookie创建/读取过程:
您要问的是......能够阅读您在步骤#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
。