J'écris une API de repos avec Slim. J'ai écrit un petit middleware pour protéger les ressources afin que seuls les utilisateurs authentifiés puissent y accéder: Ceci fonctionne, mais l'effet secondaire indésirable est le middleware ne fait pas une distinction entre existants itinéraires et itinéraires non existants. Par exemple, si l'utilisateur tente de demander un itinéraire comme / dfgghfgh code> qui n'existe pas, au lieu d'obtenir un code d'état HTTP de 404, il obtiendra 403 en disant qu'il n'y a pas de jeton d'accès. Je voudrais ajouter une implémentation similaire à la vérification suivante de la classe middleware: p>
if ($app->hasRoute($app->request->getPathInfo()){
$this->next->call(); //let go so user gets 404 from the app.
}
3 Réponses :
Pas exactement ce que vous demandez, mais personnaly quand j'ai besoin de vérifier l'authentification sur certains itinéraires, je le fais comme ceci.
config: p> middleware: < / p> mais si presque tous vos itinéraires ont besoin d'authentification peut-être pas la meilleure solution. P> Super exemple: http://www.slideshare.net/jeremykendall/ekeeting-it-small-slim-php P> p>
Merci d'avoir répondu. Donc, fondamentalement, vous faites juste le contraire: au lieu de laisser tomber des itinéraires disponibles au public, vous attrapez simplement ceux qui ont besoin d'une authentification. Dans mon cas, presque toutes les ressources nécessitent une authentification, je ne pense donc pas que cette approche correspond à mon article d'utilisation.
J'utilise un Hook pour faire ce que vous essayez de faire, comme l'a suggéré Mamawalter, mais vous voulez Utilisez Je fais exactement que dans mes propres Middleware d'autorisation . Fonctionne comme un charme. P> slim.before.dispatch code> plutôt qu'un crochet antérieur. Si l'itinéraire que votre utilisateur essaie de visiter n'existe pas, le crochet ne sera jamais appelé et le
404 code> est lancé. P>
Je viens de réaliser que vous avez écrit le didacticiel que j'ai suivi et que mon exemple est basé sur votre travail :) Bon travail, vraiment utile ... désolé je devrais le mentionner.
C'est génial! Je pensais que ça avait l'air familier. Je pensais que c'était juste un cas de grands esprits qui pensant ressemblent à :-) On dirait que je dois mettre à jour la méthode de la méthode pour changer le crochet recommandé.
Est-il possible de ne comporter que quelques itinéraires pour déclencher un appel de middleware ()?
Peut-être que ma mise en œuvre fonctionnera pour vous:
<?php class CustomAuth extends \Slim\Middleware { public function hasRoute() { $dispatched = false; // copied from Slim::call():1312 $matchedRoutes = $this->app->router->getMatchedRoutes($this->app->request->getMethod(), $this->app->request->getResourceUri()); foreach ($matchedRoutes as $route) { try { $this->app->applyHook('slim.before.dispatch'); $dispatched = $route->dispatch(); $this->app->applyHook('slim.after.dispatch'); if ($dispatched) { break; } } catch (\Slim\Exception\Pass $e) { continue; } } return $dispatched; } public function call() { if ($this->hasRoute()) { if ($authorized) { $this->next->call(); } else { $this->permissionDenied(); } } else { $this->next->call(); } } }