Auth :: пытающийся вызов функции-члена prepare () в null - PullRequest
0 голосов
/ 10 июля 2019

По сути, я получаю пользователя с именем пользователя @ тип компании, и после взрыва я ищу данные о подключении конкретной базы данных клиента.

После изменения базы данных во время выполнения я пытаюсь войти в систему, ноAuth :: попытка не работает.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\SysClient;
use App\User;
use Config;
use Hash;
use DB;

...

public function authenticate(Request $request)
{
    $request->validate([
        'username' => 'required|string',
        'password' => 'required|string',
    ]);

    $data = explode('@', $request->username);
    $username = $data[0];
    $alias = $data[1];
    $password = $request->password;
    //$password = Hash::make($request->password);

    $client = SysClient::where('alias', $alias)->first();

    $connection = [
        "driver" => $client->driver,
        "host" => $client->host,
        "port" => $client->port,
        "database" => $client->database,
        "username" => $client->username,
        "password" => $client->password,
        "unix_socket" => $client->unix_socket,
        "charset" => $client->charset,
        "collation" => $client->collation,
        "prefix" => $client->prefix,
        "prefix_indexes" => $client->prefix_indexes,
        "strict" => $client->strict,
        "engine" => $client->engine
    ];

    $request->session()->put('current_database', $connection); // save $connection in session

    Config::set('database.connections.default', $connection); // set new connection
    DB::purge('default'); // purge connection settings
    DB::reconnect('default'); // reconnect database

    //dd(DB::connection()->getDatabaseName()); //it works!

    $credentials = [
        'username' => $username, // string
        'password' => $password, // string
        'active' => 1
    ];

    //dd(User::all()); //it works!

    //So far everything works, the error happens when executing the next line

    if (Auth::attempt($credentials)) {
        dd('Authentication passed...');
    } else {
        dd('fail');
    }

}

Я ожидал, что Auth :: попытается вернуть true или false, но, похоже, не хочет работатьс обновленным подключением к базе данных.

1 Ответ

0 голосов
/ 11 июля 2019

Я нашел источник проблемы, но до сих пор не знаю, как ее исправить.

Управление сеансом в Google App Engine должно выполняться базой данных, а не файлом.

Система загружает базу данных «основная» и записывает сеанс в таблицу «сеансы».Когда соединение изменено, сеанс не существует в новой базе данных, и когда laravel пытается изменить / удалить запись таблицы для сеанса, он не находит ее и возвращает ошибку:

"Вызов функции-членаprepare () для null "on \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Connection.php

в строке 479:

$statement = $this->getPdo()->prepare($query);

, помещая это в предыдущую строку (478)

dd($query, $bindings);

Я получаю:

"update `sessions` set `payload` = ?, `last_activity` = ?, `user_id` = ?, `ip_address` = ?, `user_agent` = ? where `id` = ?"

array:6 [▼
  0 => "YTo0OntzOjY6Il90b2tlbiI7czo0MDoiNTVkSHFUS0tFeDF3SDhBeGRTN1E1UWJhblA2M3lhaGdueVNNSGFYRCI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6Mjc6Imh0dHA6Ly9sb2NhbGhvc3Q6 ▶"
  1 => 1562871843
  2 => null
  3 => "127.0.0.1"
  4 => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"
  5 => "OuxA1KMCkIPnobRHB626VlyivPFI6aW860CvEs7s"
]

Я не могу работать с сессиями над файлами в Google App Engine, они должны оставаться в базе данных.Тогда может возникнуть вопрос, как переместить сеанс из таблицы в «основной» базе данных в таблицу в клиентской базе данных.Или, если возможно, завершить сеанс в «основной» базе данных и начать новый сеанс в клиентской базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...