Всем добрый день!
У меня есть рабочий тонкий код здесь с 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'); }
Когда я пытаюсь войти в систему с помощью окна ввода всплывающих окон, он работает, но я действительно хочу перенаправить его на мою страницу входа вместо этого.
Любая помощь приветствуется.
Среднее ПО реализует аутентификацию 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.