与PHP共享Laravel身份验证/会话

时间:2014-01-07 09:47:32

标签: php session authentication laravel

我正在尝试将Laravels身份验证与许多简单的HTML / Javascript应用程序一起使用。

我认为理想的工作方式是:

  1. 用户访问简单的HTML应用程序
  2. 简单的HTML应用程序包含一个PHP文件,用于检查是否存在 用户已通过身份验证。如果不是这种情况,则发送给用户 要登录的Laravel应用程序,如果用户已登录,则只需使用该应用程序即可。
  3. 用户通过Laravel登录,并重定向回HTML应用程序,此过程将重新开始。
  4. 我遇到的问题是检查用户是否登录了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会话包?)。

2 个答案:

答案 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

请参阅:https://gist.github.com/frzsombor/ddd0e11f93885060ef35