Laravel: неопределенное смещение 0 в symfony / http-foundation, когда требуется SimpleSAMLphp - PullRequest
1 голос
/ 08 февраля 2020

Я пытаюсь обновить зависимости в простом Laravel 5.7 приложении, которое аутентифицирует пользователя через SimpleSAML php, а затем отображает некоторую информацию, полученную из внешнего API.

Похоже, что-то изменилось между версией 4.3.8 и версией 4.4.0 библиотеки symfony / http-foundation, включенной в Laravel, потому что при обновлении этой зависимости я получаю следующую ошибку:

ErrorException (E_NOTICE): Undefined offset: 0 …/vendor/symfony/http-foundation/HeaderBag.php 126

Похоже, что это вызвано требованием файла автозагрузки поставщика услуг SimpleSAML php, даже если я не вызываю какие-либо методы.

Поскольку это чрезвычайно простое одностраничное приложение, я просто использую промежуточное программное обеспечение для обработки интеграции SimpleSAML php:

namespace App\Http\Middleware;

use Closure;

class SimpleSAMLphp
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        /**
         * Load SimpleSAMLphp library
         */
        require_once('redacted/path/simplesaml/lib/_autoload.php');
        $ssphp = new \SimpleSAML\Auth\Simple('service-provider-name');
        $ssphp->requireAuth();

        return $next($request);
    }
}

Похоже, Symfony HTTP Foundation изменил способ они проверяют информацию заголовка в этой версии (здесь я вижу обширные изменения: https://github.com/symfony/http-foundation/compare/v4.3.8...v4.4.0), но я не понимаю, почему это происходит, когда SimpleSAML php находится в миксе.

Я глубоко в этой кроличьей норе - любое руководство будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Я получаю ту же проблему с Laravel 5.8 и установкой SimpleSAML Php.

Пока только немного поковырялся, но похоже, что HeaderBag. php называется по крайней мере, дважды во время запроса. Существует один конкретный вызов (где возникает ошибка), когда он пытается разрешить ключ «Content-Type», который существует в $ header как «content-type» (строчные буквы), но не может быть разрешен из-за разницы в регистре. Он имеет набор других атрибутов, таких как «Cache-Control», а также в заголовке $. Если ему удается «получить» атрибут «content-type», то заголовок правильно имеет свойство смещения [0].

Я просто пытаюсь выполнить чистую установку 5.8 без моих библиотек saml auth, чтобы увидеть, он делает то же самое. Но я думаю, вы правы, что это как-то связано с аутентификацией / перенаправлением назад из SAML, которое вызывает проблему.

Будет сообщать, если я найду что-нибудь полезное.

0 голосов
/ 18 февраля 2020

Дублируйте файл HeaderBag. php и переопределите его, используя composer. Измените функцию get дублированного файла на код ниже. Единственными изменениями здесь является проверка isset. Затем http://shyammakwana.me/php/laravel-override-vendor-classes.html покажет вам, как переопределить файл Headerbag. php любого поставщика, использующего composer. Проверена работа с SimpleSaml PHP и Laravel. Наслаждайтесь!

public function get($key, $default = null)
{
    $headers = $this->all((string) $key);
    if (2 < \func_num_args()) {
        @trigger_error(sprintf('Passing a third argument to "%s()" is deprecated since Symfony 4.4, use method "all()" instead', __METHOD__), E_USER_DEPRECATED);

        if (!func_get_arg(2)) {
            return $headers;
        }
    }

    if (!$headers || !isset($headers[0])) {
        return $default;
    }

    if (null === $headers[0]) {
        return null;
    }

    return (string) $headers[0];
}
...