Тонкая базовая аутентификация

Всем добрый день!

У меня есть рабочий тонкий код здесь с slim-basic-auth, и когда я перехожу в ограниченную директорию, это показывает:

введите описание изображения здесь

Все работает, но я хотел бы перенаправить его на мою страницу входа, а не показывать всплывающее окно входа. Вот моя страница входа:

введите описание изображения здесь

Мой тонкий код:

$pdo = new \PDO("mysql:host=localhost;dbname=databasename", "username"); $app->add(new \Slim\Middleware\HttpBasicAuthentication([ "path" => "/main", "realm" => "Protected", "authenticator" => new PdoAuthenticator([ "pdo" => $pdo, "table" => "accounts", "user" => "accountUsername", "hash" => "accountPassword" ]), "callback" => function ($request, $response, $arguments) use ($app) { return $response->withRedirect('/main/contacts'); } 

Когда я пытаюсь войти в систему с помощью окна ввода всплывающих окон, он работает, но я действительно хочу перенаправить его на мою страницу входа вместо этого.

Любая помощь приветствуется.

Related of "Тонкая базовая аутентификация"

Среднее ПО реализует аутентификацию HTTP Basic Access . Диалог аутентификации запускается через заголовок ответа. Поставщик браузера может решить, как запрашивать учетные данные. Большинство браузеров используют диалоговое окно входа в контекстное меню, которое вы описали.

То, что вы пытаетесь сделать, – это немного неортодоксальный способ использования HTTP Basic Authentication. Однако вы можете отключить диалог входа в систему, удалив заголовок WWW-Authenticate из ответа. Обратите внимание, что вам нужно как минимум версия 2.0.2 для этого.

 $app->add(new \Slim\Middleware\HttpBasicAuthentication([ "path" => ["/main"], "authenticator" => new PdoAuthenticator([ "pdo" => $pdo, "table" => "accounts", "user" => "accountUsername", "hash" => "accountPassword" ]), "error" => function ($request, $response, $arguments) { return $response ->withRedirect("/auth/login") ->withoutHeader("WWW-Authenticate"); } ])); 

Однако с приведенным выше кодом вам все равно необходимо установить заголовок « Authentication: Basic запрос». Один из способов сделать это – использовать запрос AJAX.

 $.ajax({ url: "http://example.com/auth/login", username: $("username").val(), password: $("password").val(), success: function(result) { alert("Authorization header should now be set..."); } }); 

На данный момент похоже, что вы не пытаетесь использовать Http Basic Authenticator, а скорее обычный процесс входа в систему, поэтому вам нужно будет использовать сеансы и т. Д.

Очень простой пример заключается в том, что вы добавляете это близко к нижней части стека промежуточного программного обеспечения (это означает, что он будет выполнен первым, так как он будет находиться в верхней части стека)

 $middleware = function (Request $request, Response $response, $next) { if (!isset($_SESSION['__user'])) { //don't interfere with unmatched routes $route = $request->getAttribute('route'); if ($route && !in_array($route->getName(), ['login'])) { return $response->withStatus(403)->withHeader('Location', $this->router->pathFor('login')); } } return $next($request, $response); }; $app->add($middleware); 

Глядя на промежуточное ПО HttpBasicAuthentication он всегда отправляет заголовок WWW-Authenticate делая вашу регистрационную форму бесполезной, поскольку она вызывает всплывающее окно auth.