【问题标题】:Enabling session in lumen framework在流明框架中启用会话
【发布时间】:2018-04-13 13:00:26
【问题描述】:

我有两个(但让我们想象更多)微服务 (API),它们需要了解经过身份验证的用户。理想情况下,我只想恢复他们的会话。

所有微服务都使用相同的会话存储:redis。

所有 API 调用都将具有 Cookie 标头,因此所有服务都将能够基于该 cookie 恢复会话。我已经通过 PHP $_SESSIONs 成功实现了这一点。

现在的问题是:您将如何使用 Laravel/Lumen 实现这一点?

【问题讨论】:

  • 太宽泛,主要是基于意见的问题。有很多方法可以做到这一点。例如,使用“缓存服务器”进行会话存储,如 redis。
  • 您是否使用任何 API 网关进行身份验证,或者您尚未开始实施。 ?
  • 我最近从事微服务工作,我们使用 Kong 作为 API 网关来附加身份验证头,然后每个微服务都会收到这些详细信息,并从 Redis 或任何 db 获取用户
  • @rummykhan 考虑使用 AWS API 网关。我担心的是 Laravel 有 session 而 Lumen 没有。
  • @rock3t,我完全尊重你的意见,但你为什么需要微服务中的会话,我还是迷路了。

标签: laravel microservices lumen


【解决方案1】:

2021 年 3 月 5 日的最后更新

(这个答案引起了 Laravel 社区的广泛关注,所以我想更新它。)

Laravel 从 5.2 及更高版本正式停止支持 laravel/lumen 框架中的会话和视图。

但是laravel 仍然有一个组件illuminate/session 可以安装在lumen/framework 中,我们可以玩弄这个。

步骤 - 1

使用安装illuminate/session

composer require illuminate/session

步骤 - 2

现在转到 bootstrap/app.php 并添加此中间件

$app->middleware([
    \Illuminate\Session\Middleware\StartSession::class,
]);

添加上述中间件的目的是在每次请求时启动会话并在响应之前保存会话。

步骤 - 3

现在添加config/session.php,因为默认情况下Lumen 中不存在它。你可以从Laravel official reposession.php

步骤 - 4

创建框架会话存储目录

mkdir -p storage/framework/sessions

感谢DayDream

步骤 - 5

bootstrap/app.php 中为\Illuminate\Session\SessionManager 添加绑定

$app->singleton(Illuminate\Session\SessionManager::class, function () use ($app) {
    return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session');
});

$app->singleton('session.store', function () use ($app) {
    return $app->loadComponent('session', Illuminate\Session\SessionServiceProvider::class, 'session.store');
});

感谢@xxRockOnxx 找到loadComponent 方法。 它需要 3 个参数,

  • 第一个是config 文件名。 (文件应存在于config/ 目录中)
  • 第二个是ServiceProvider FQN
  • 第三个是这个方法的返回。

loadComponent 只是调用$app->register 并在构建ServiceProvider 时注入$app

如何使用


// Save Session
$router->get('/', function (\Illuminate\Http\Request $request) {

    $request->session()->put('name', 'Lumen-Session');

    return response()->json([
        'session.name' => $request->session()->get('name')
    ]);
});


// Test session
$router->get('/session', function (\Illuminate\Http\Request $request) {

    return response()->json([
        'session.name' => $request->session()->get('name'),
    ]);
});

我还在 github 上添加了示例,支持从 lumen 框架 v5.6 一直到当前版本 v8.0。

https://github.com/rummykhan/lumen-session-example

【讨论】:

  • 非常感谢。这很有帮助
  • 但是重定向器(例如使用redirect() 时)会话未设置,它始终为空。我可以看到请求对象上设置的会话对象,因此我能够正确使用 view()->with() 但是如果我使用 redirect()->with() 它会由于重定向器上的会话对象为空而失败跨度>
  • 当我这样做时,我得到:会话存储未按要求设置。
  • 在第 4 步中,您可能需要添加一个 .gitignore 文件 - github.com/laravel/laravel/blob/8.x/storage/framework/sessions/…
  • 它正在为每个新请求创建会话,我可以检查我的会话目录,它生成了很多文件。几天/几个月后它不会导致内存问题..?
【解决方案2】:

重要的是你也要使用$request->session(),否则它将不起作用。

【讨论】:

    【解决方案3】:

    我尝试了上面提到的解决方案,但是如果使用默认设置,还需要创建一个文件夹storage/framework/sessions

    【讨论】:

      【解决方案4】:

      接受的答案已过时。

      我在question的回答中回答并解释了如何正确地做到这一点

      我还在Laracasts发布了我的问题有什么问题

      引用:

      在您提供的链接中找到的解决方案是,首先它告诉您手动注册SessionManager 以防止unresolvable depedency parameter #0 $app 然后还注册现有的SessionServiceProvider,它还绑定另一个实例SessionManager

      问题在于,一些组件使用另一个实例,而其他部分使用新实例,这导致我的身份验证 attempt 会话没有被保存,尽管实际上是 put 在里面。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-27
        • 2011-03-21
        • 2014-02-11
        • 1970-01-01
        • 2012-12-21
        • 2020-11-22
        • 1970-01-01
        • 2016-07-26
        相关资源
        最近更新 更多