苗条的基本身份验证

Slim Basic Authentication

大家好!

我这里有一个使用 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 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 header 让您的登录表单无用,因为它会触发身份验证 pop-up.

中间件实现HTTP Basic Access Authentication。通过响应 header 触发身份验证对话框。由浏览器供应商决定如何询问凭据。大多数浏览器使用您描述的弹出式登录对话框。

您尝试做的是一种使用 HTTP 基本身份验证的非正统方式。但是,您可以通过从响应中删除 WWW-Authenticate header 来禁止登录对话框。请注意,您至少需要版本 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 请求 header。一种方法是使用 AJAX 请求。

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