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

Posted

技术标签:

【中文标题】与 PHP 共享 Laravel 身份验证/会话【英文标题】:Share Laravel authentication/session with PHP 【发布时间】:2014-01-24 22:41:59 【问题描述】:

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

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

    用户访问简单的 HTML 应用程序 简单的 HTML 应用程序包含一个 php 文件,该文件检查是否存在 用户已通过身份验证。如果不是这种情况,则将用户发送到 Laravel 应用程序登录,如果用户已登录,他可以简单地使用该应用程序。 用户通过 Laravel 登录并被重定向回 HTML 应用程序,该过程将重新开始。

我遇到的问题是检查用户是否登录了 PHP 脚本。 Laravel 会话在那里不可用(通过 session_start()$_SESSION["auth"] = true 共享它只会将变量添加到原生 PHP 会话的 Laravel 版本)。

这些是我在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 脚本中使用 Laravel 会话包?)。

【问题讨论】:

【参考方案1】:

另一种解决方案:使用以下代码,您可以使用真正的 Laravel 会话启动 Laravel,因此您实际上可以使用 Auth::check() 进行授权,甚至不必使用本机 $_SESSION。

见:https://gist.github.com/frzsombor/ddd0e11f93885060ef35

【讨论】:

嗨@frzsombor 我如何使用您的脚本从 cakePHP 2.5 到 laravel 进行身份验证?反之亦然?你能提供更多细节吗?【参考方案2】:

Laravel 使用存储驱动程序来管理它的会话——这意味着试图通过 PHP 的 $_SESSION 变量访问它的内容永远不会奏效。您的配置将默认会话驱动程序设置为“本机”(我认为)文件会话驱动程序,这意味着所有会话数据都存储在 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 并使用它来读取另一个...一个优雅的解决方案。

所以我建议使用我谈到的第一种方法并实现一个简单而安全的会话管理系统。希望这有帮助!

【讨论】:

感谢您澄清这一点。我想我可以将 Sentry 与 Laravel 结合用于用户管理系统,并使用 Sentry 和 PHP 使用相同的数据库进行应用程序登录。

以上是关于与 PHP 共享 Laravel 身份验证/会话的主要内容,如果未能解决你的问题,请参考以下文章

通过多个 Laravel 5 安装跨子域共享身份验证会话

Laravel与Socket.io Nodejs共享会话

Laravel 7 手动身份验证会话问题

由用户会话验证的Laravel API路由

Laravel 5:使用 Laravel 会话数据的 Socket.io 客户端身份验证

从 iOS 容器应用与应用扩展共享 Firebase 身份验证会话