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

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

У меня есть рабочий тонкий код с тонкая базовая-аутентификация и когда я иду в ограниченный каталог, это обнаруживается:

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

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

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

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

$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');
}

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

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

2

Решение

Промежуточное программное обеспечение 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...");
}
});
2

Другие решения

На данный момент кажется, что вы не пытаетесь использовать 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 заголовок делает вашу форму входа бесполезной, так как она вызовет всплывающее окно авторизации.

2

По вопросам рекламы [email protected]