2016-03-23 27 views
3

おはようございます!Slim Basic Authentication

私はslim-basic-authとここで働くスリムなコードを持っていると私は制限されたディレクトリに移動したときに、これは現れる:

enter image description here

すべてが動作しますが、私がやりたかったことは、私にそれをリダイレクトすることですログインページを表示するのではなく、ログインページを表示します。マイスリムコード

enter image description here

:ここに私のログインページがある

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

私はポップアップログインボックスを使用してログインしようとすると、それは動作しますが、私は本当に私にそれをリダイレクトしますその代わりにログインページ。

ご協力いただければ幸いです。

+1

どのようにディレクトリを制限していますか?私は、PHPコードが実行される前に、Webサーバーの設定によって起こっていると思います。 –

答えて

2

ミドルウェアはHTTP Basic Access Authenticationを実装しています。応答ヘッダーを介して認証ダイアログが表示されます。資格情報の入力方法は、ブラウザのベンダーによって異なります。ほとんどのブラウザでは、説明したポップアップログインダイアログが使用されます。何をしようとする

は、HTTP基本認証を使用するビット非正統的な方法です。ただし、応答から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リクエストヘッダを設定する必要があります。 1つの方法は、AJAXリクエストを使用することです。

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

あなたはセッションや、そのようなを使用する必要がありますので、HTTP基本認証ではなく、通常のログイン・プロセスを使用しようとしていないように、この時点で、それが見えます。非常に単純な例では、あなたのミドルウェア・スタックの一番下に、これが近く追加され

。(それは、スタックの最上位になりますよう、それが最初に実行されるという意味)

HttpBasicAuthenticationミドルウェアを見てみると
$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); 

ヘッダーが送信され、ログインフォームが役に立たなくなり、認証ポップアップが起動されます。