Всем добрый день!
У меня есть рабочий тонкий код с тонкая базовая-аутентификация и когда я иду в ограниченный каталог, это обнаруживается:
Все работает, но я хотел перенаправить его на мою страницу входа в систему вместо отображения всплывающего окна входа в систему. Вот моя страница входа:
Мой тонкий код:
$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 базовая аутентификация доступа. Диалог аутентификации запускается через заголовок ответа. Поставщик браузера должен решить, как запрашивать учетные данные. Большинство браузеров используют всплывающее диалоговое окно входа в систему, которое вы описали.
То, что вы пытаетесь сделать, это немного неортодоксальный способ использования 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
заголовок делает вашу форму входа бесполезной, так как она вызовет всплывающее окно авторизации.