我正在尝试将Laravels身份验证与许多简单的HTML / Javascript应用程序一起使用。
我认为理想的工作方式是:
我遇到的问题是检查用户是否登录了PHP脚本。 Laravels会话在那里不可用(并通过session_start()
和$_SESSION["auth"] = true
共享它只会将变量添加到原生PHP会话的Laravels版本中。)
这些是app/config/session.php
return array(
'driver' => 'native',
'lifetime' => 120,
'files' => storage_path().'/sessions',
'connection' => null,
'table' => 'sessions',
'lottery' => array(2, 100),
'cookie' => 'laravel_session',
'path' => null,
'domain' => null,
);
我已将路径更改为null
,因为我想在整个域中使用该会话。
我包含的PHP脚本非常简单,如下所示:
session_start();
if($_SESSION['authenticated']){
echo "logged_in";
} else {
header("Location: laravel/login/url");
}
您可能想知道为什么我不仅仅将应用程序包含在Laravels框架中,这是因为这个简单的HTML应用程序大约有100个不同版本分散在10个域名中,目前每个域名都有自己的(很老)和不安全的)登录脚本(每次创建新域时都会复制)。因此,我希望使用Laravel将其集中在一个数据库和一个管理系统中。
希望有人在这里知道如何解决这个问题或解决它(也许我应该尝试在我的PHP脚本中使用Laravels会话包?)。
答案 0 :(得分:3)
Laravel使用存储驱动程序进行会话管理 - 这意味着尝试通过PHP $ _SESSION变量访问它的内容永远不会有效。您的配置是将默认会话驱动程序设置为“native”(我认为)文件会话驱动程序,这意味着所有会话数据都存储在app / storage / sessions中(我相信它会将会话数据存储在某些类似JSON的结构中)。您可以阅读有关会话驱动程序here的更多信息。
所以要回答你的问题,有几种方法可以解决这个问题。我可能会做的是实现一个简单的自定义会话界面,只需检查用户是否已登录。当您通过laravel表单对用户进行身份验证时,可以将用户的会话设置为登录。例如:
if (Auth::attempt(array('email' => $email, 'password' => $password))) {
// Set your user's session to logged in here. You will have to implement some
// system to do so, the below code is INSECURE/NOT USEABLE
$_SESSION['user'] = $email;
}
然后当用户退出时你会反过来。如上所述,简单地将用户的会话设置为登录是非常不安全的,原因很多,最明显的是会话劫持。 (This是关于这个主题的优秀读物)如果你可以实现一个安全的会话管理系统(实际上,它应该不难并且很轻),那么我认为这个策略是你最好的选择。
另一种方法是尝试使用cookie作为会话驱动程序,但这样做会增加更多层次的复杂性和垃圾,因为您首先必须从一个cookie获取Laravel会话ID并使用它来读取另一个...一个优雅的解决方案。
所以我建议使用我谈到的第一种方法,并实现一个简单安全的会话管理系统。希望这有帮助!
答案 1 :(得分:2)
另一种解决方案:使用以下代码,您可以使用真正的Laravel会话启动到Laravel,因此您实际上可以使用Auth :: check()进行授权,甚至不必使用本机$ _SESSION