2016-03-23 36 views
3

Herkese iyi günler!İnce Temel Kimlik Doğrulama

Ben slim-basic-auth burada çalışan bir ince kod var ve kısıtlı dizine gittiğinde, bu gösterir:

enter image description here

Her şey çalışır, ama ne yapmak istediği için onu yöneltmek olan benim açılır giriş kutusu göstermek yerine giriş sayfası. İşte benim giriş sayfanız:

enter image description here

Benim ince kodu:

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

ben açılan giriş kutusunu kullanarak giriş deneyin, çalışıyor ama gerçekten bunu yönlendirmek istiyorum benim bunun yerine giriş sayfası.

Herhangi bir yardım çok takdir edilecektir.

+1

Dizini nasıl kısıtlıyorsunuz? PHP kodu çalıştırılmadan önce web sunucusu yapılandırması ile gerçekleşeceğini tahmin ediyorum. –

cevap

2

Ara katman, HTTP Basic Access Authentication'u uygular. Kimlik doğrulama iletişim kutusu, yanıt başlığı ile tetiklenir. Kimlik bilgilerinin nasıl sorulacağına karar vermek tarayıcı tarayıcısına kalmıştır. Çoğu tarayıcı, açıkladığınız popup giriş iletişim kutusunu kullanır.

Yapmaya çalıştığınız şey, HTTP Temel Kimlik Doğrulaması'nı kullanmanın biraz alışılmadık bir yoludur. Ancak, WWW-Authenticate üstbilgisini yanıttan kaldırarak oturum açma iletişimini bastırabilirsiniz. Bunun çalışması için en az 2.0.2 sürümüne ihtiyacınız olduğunu unutmayın.

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

Ancak koduyla sen hala bir şekilde Authentication: Basic isteği başlığını ayarlamak zorunda yukarıda. Bir yolu AJAX isteğini kullanmaktır.

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

Bu noktada, Http Basic Authenticator'ı kullanmaya çalışmamanıza, normal bir oturum açma işlemi yapmaya çalışmamanıza, böylece oturumları ve benzeri uygulamaları kullanmanız gerekeceğine benziyor.

Çok basit bir örnek senin orta katman yığının altına ramak ekliyor. (Bu yığının en üstünde olacak şekilde ilk çalıştırılacaktır anlam)

$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 katman baktığımızda WWW-Authenticate üstbilgisini her zaman gönderim formunuzu işe yaramaz hale getirir, çünkü auth pop-up'ını tetikler.