2016-04-09 28 views
6

Chcę sprawdzić, czy użytkownik jest zalogowany. Dlatego mam klasa wiedźma zwraca true lub false. Teraz chcę middleware, który sprawdza, czy użytkownik jest zalogowany.Slim 3 Middleware Przekierowanie

$app->get('/login', '\Controller\AccountController:loginGet')->add(Auth::class)->setName('login'); 
$app->post('/login', '\Controller\AccountController:loginPost')->add(Auth::class); 

Auth Klasa

class Auth { 
    protected $ci; 
    private $account; 

    //Constructor 
    public function __construct(ContainerInterface $ci) { 
     $this->ci = $ci; 
     $this->account = new \Account($this->ci); 
    } 

    public function __invoke($request, \Slim\Http\Response $response, $next) { 
     if($this->account->login_check()) { 
      $response = $next($request, $response); 
      return $response; 
     } else { 
      //Redirect to Homepage 
     } 

    } 
} 

Więc gdy użytkownik jest zalogowany na stronie odda poprawnie. Ale gdy użytkownik nie jest autorytetem, chcę przekierować na stronę główną. Ale jak?!

$response->withRedirect($router->pathFor('home'); 

To nie działa!

Odpowiedz

9

Musisz odpowiedzieć na return. Nie zapominaj, że obiekty request i są niezmienne.

return $response = $response->withRedirect(...); 

Mam podobny auth middleware i to w jaki sposób to zrobić, który dodaje również 403 (nieautoryzowany) nagłówek.

$uri = $request->getUri()->withPath($this->router->pathFor('home')); 
return $response = $response->withRedirect($uri, 403); 
+1

To rozwiązanie nie działa – Vashtamyty

+0

Z poziomu oprogramowania pośredniczącego, to nie zadziała. – systemovich

+0

W przypadku OP nie zdefiniowali zmiennej '$ router' przed jej użyciem. Gdzie definiujesz '$ this-> router' przy założeniu, że Twoje oprogramowanie pośrednie nie dziedziczyło z innej klasy? –

-2

Zastosowanie:

http_response_code(303); 
header('Location: ' . $url); 
exit; 
+1

Spróbuj wyjaśnić swoją odpowiedź, zamiast tylko pisać kod. –

+0

@NahuelIanni, to zrozumiałe, jeśli znasz PHP. – systemovich

+2

Chociaż jestem pewny, że to prawdopodobnie działa, OP prawdopodobnie szukał rozwiązania, które używało funkcjonalności Slim Framework zamiast zwykłego PHP. –

1

budynku off odpowiedzi tflight, będziesz musiał wykonać następujące czynności, aby wszystko działa zgodnie z przeznaczeniem. Próbowałem przesłać to jako wersję, ponieważ kod podany w odpowiedzi tflight nie działałby na frameworku po wyjęciu z pudełka, ale został odrzucony, więc podając go w oddzielnej odpowiedzi:

Będziesz potrzebował następujących dodatek do pośredniczącego:

protected $router; 

public function __construct($router) 
{ 
    $this->router = $router; 
} 

Dodatkowo podczas deklarowania middleware, to musiałby dodać następujące konstruktora:

$app->getContainer()->get('router') 

coś podobnego do:

$app->add(new YourMiddleware($app->getContainer()->get('router'))); 

Bez tych zmian rozwiązanie nie zadziała, a pojawi się błąd, że $ ten-> router nie istnieje.

Z tych zmian na miejscu można wtedy wykorzystywać kod dostarczony przez tflight

$uri = $request->getUri()->withPath($this->router->pathFor('home')); 
return $response = $response->withRedirect($uri, 403);