强制Laravel使用旧身份验证登录用户

Jef*_*ert 8 php authentication legacy laravel laravel-5.4

我正在尝试将Laravel慢慢集成到一个遗留的PHP应用程序中.其中一项任务是在用户登录旧应用程序时自动注册Laravel用户会话.我不是想实现Laravel身份验证,我真的只想捎带现有功能并强制特定用户登录而不检查凭据.到目前为止,我所发现的是从我发现的其他人的黑客中拼凑而成的:

// Laravel authentication hook - Boostrap application
require_once getcwd() . '/../laravel/bootstrap/autoload.php';
$app = require_once getcwd() . '/../laravel/bootstrap/app.php';
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$kernel->bootstrap();
$app->boot(); 

// Start Laravel session
$request = Illuminate\Http\Request::capture();
$response = $app->make('Symfony\Component\HttpFoundation\Response');
$startSession = new Illuminate\Session\Middleware\StartSession($app['session']);
// Associate server session with the authenticating user id
// I have also tried loading user model instance and then $app['auth']->login($user)
$app['auth']->loginUsingId($user_id);

$app['session']->driver()->start();
// Terminate middleware response chain with naked response
$response = $startSession->handle($request, function() use($response) {
    return $response; // This response will have session cookie attached to it
});

$response->send();
Run Code Online (Sandbox Code Playgroud)

在此之后,我得到一个laravel_session在客户端上有内容的cookie.在上面的代码执行后的登录请求期间,如果我dd(Auth::user())然后我得到我刚刚登录的用户.但是,在后续请求中,Auth::user()并且$this->request->user()null在所有上下文中返回.

如何在没有实际身份验证的情况下强制执行活动的Laravel用户会话?


最终的结果是,Laravel将作为遗留应用程序下的"子应用程序"运行,而现有功能将逐个拉入,这样两者都将存在一段时间,直到所有功能都在Laravel中实现,并且它将取代完整的现有应用程序.如果尝试用Laravel接管遗留身份验证更有意义而不是相反,我会对此持开放态度,但我宁愿避免更改底层用户表(遗留身份验证通过LDAP发生,所以本地没有密码,没有remember_token,但如果必须的话,这很容易添加.我真的只是寻找最短的路径,最少的努力/头痛.

Amr*_*gar 5

这有点棘手,因为 Laravel 使用由 EncryptCookies 中间件处理的加密 cookie。如果禁用它,您可以让代码正常工作,但我不推荐它。

解决方案是使用 Laravel EncryptCookies 中间件解密请求,然后加密响应。这将使 Laravel 可以读取旧版身份验证创建的会话。

考虑这个名为login.php的文件,它需要$user_id通过id将用户登录到laravel。

<?php

require_once getcwd() . '/../laravel/bootstrap/autoload.php';
$app = require_once getcwd() . '/../laravel/bootstrap/app.php';
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$kernel->bootstrap();
$app->boot();

$request = Illuminate\Http\Request::capture();
$response = $app->make('Symfony\Component\HttpFoundation\Response');
$startSession = new Illuminate\Session\Middleware\StartSession($app['session']);
$encryptCookies = new App\Http\Middleware\EncryptCookies($app['encrypter']);

$app['session']->driver()->start();

$app['auth']->loginUsingId($user_id);

$response = $encryptCookies->handle($request, function ($request) use ($startSession, $response)
{
    return $startSession->handle($request, function () use ($response)
    {
        return $response;
    });
});

$app['session']->driver()->save();

var_dump($app['auth']->user());

$response->send();
Run Code Online (Sandbox Code Playgroud)

在 的闭包内$encryptCookies->handle(),您可以在解密后读取请求,并且可以在此处修改会话。当您返回响应时,它将再次加密,然后您可以将其发送到浏览器。

要读取另一个文件中的会话,您可以简单地执行以下操作:

<?php

require_once getcwd() . '/../laravel/bootstrap/autoload.php';
$app = require_once getcwd() . '/../laravel/bootstrap/app.php';
$kernel = $app->make('Illuminate\Contracts\Console\Kernel');
$kernel->bootstrap();
$app->boot();

$request = Illuminate\Http\Request::capture();
$response = $app->make('Symfony\Component\HttpFoundation\Response');
$startSession = new Illuminate\Session\Middleware\StartSession($app['session']);
$encryptCookies = new App\Http\Middleware\EncryptCookies($app['encrypter']);

$response = $encryptCookies->handle($request, function ($request) use ($startSession, $response)
{
    return $startSession->handle($request, function () use ($response)
    {
        return $response;
    });
});

var_dump($app['auth']->user());

$response->send();
Run Code Online (Sandbox Code Playgroud)