7
votes

Slim PHP: Seulement attraper des itinéraires valides avec middleware

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: xxx pré>

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.
}


0 commentaires

3 Réponses :


2
votes

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: xxx

middleware: < / p> xxx

mais si presque tous vos itinéraires ont besoin d'authentification peut-être pas la meilleure solution.

Super exemple: http://www.slideshare.net/jeremykendall/ekeeting-it-small-slim-php


1 commentaires

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.



6
votes

J'utilise un Hook pour faire ce que vous essayez de faire, comme l'a suggéré Mamawalter, mais vous voulez Utilisez slim.before.dispatch 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 est lancé.

Je fais exactement que dans mes propres Middleware d'autorisation . Fonctionne comme un charme.


3 commentaires

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 ()?



2
votes

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();
        }
    }
}


0 commentaires