Es wäre interessant zu sehen, welche sind Ihre Routen, aber im Grunde in der aktuellen Konfiguration Ihr sagen:
1) Authentifizieren NICHT "/ api/Auth", "/ api/users", "/api/products ","/api/orders ","/api/roads ","/api/reservations ","/api/feedbacks "und" api/menu "(der Rest der Endpoints unter/api MUSS authentifiziert werden)
2) und auch die Authentifizierung nicht unabhängig von POST oder GET Anfrage
einige Beispiele:
PUT /api/users
wird NIE authentifizieren, da/api/Benutzer in RequestPathRule ist
GET /api/users
wird nie authentifizieren, da/api/Benutzer in RequestPathRule ist und erhalten Sie in RequestMehtodRule ist
PUT /api/whatever
IMMER da/api authentifizieren werden/Benutzer ist NICHT in RequestPathRule AND
GET ist in RequestMethodRule NICHT
Grundsätzlich Regeln wie eine OR-Vergleichsoperator und im richtigen Moment arbeiten ein Endpunkt ist in RequestP athRule OR eine Anfrage-Methode ist in RequestMethodRule die Anfrage wird nicht authentifiziert werden.
Ein besserer Ansatz könnte sein, zu versuchen, RequestMethodRule nicht so oft wie möglich zu verwenden (im Allgemeinen fügen Sie einfach die OPTIONS-Methode hinzu) und mit unterschiedlichen Pfaden zu spielen.
In einer normalen Web-Anwendung finden Sie einen öffentlichen API Weg zu Ihren Kunden unter /api
bieten und der einzige Endpunkt Sie authentifizieren im Allgemeinen nicht ist /api/login
(oder /api/auth
in Ihrem Beispiel) der Rest des Endpunkts unter /api
authentifiziert werden. Wenn Sie einen anderen Satz von Endpunkten bereitstellen, die Sie nicht authentifizieren möchten, geben Sie einen anderen Pfad ein, z. B. /service
, und Sie enthalten ihn nicht als "Pfad" in RequestPathRule. Wenn Sie eine Gruppe von authentifizierten Endpunkt-ALL benötigen, erstellen Sie alle von dann unter einem neuen Pfad, sagen wir /admin
und Sie fügen Pfad in RequestPathRule hinzu, und Sie fügen kein "Passthrough" für sie hinzu.
Also die Idee ist mit anderen Pfad spielen und fügen Sie einfach diese Methoden unter RequestMethodRule für bestimmte Anwendungsfälle. Außerdem haben Sie auf diese Weise eine klarere und übersichtlichere API.
Wenn Sie Ihre Endpunkte betrachten, empfehle ich Ihnen, für die meisten von ihnen einen anderen Pfad zu erstellen, anstatt "/ api/auth", "/ api/users", "/ api/products", "/ api/orders" Ich würde vorschlagen, dass Sie "/ auth", "/ user", "/ product", "/ order" ... und Sie können für jeden Pfad eine RequestPathRule
und RequestMethodRule
hinzufügen.
Um ehrlich zu sein, wie die Slim-JWT-Auth-Middleware gedacht ist, ist es schwierig, CRUD-Operationen über denselben Endpunkt bereitzustellen, sagen wir, Sie haben GET, POST, PUT und DELETE über /user
und Sie möchten nur POST, PUT authentifizieren und LÖSCHEN. Für diesen Fall können Sie zwei Möglichkeiten:
- für jedes Verb differen Endpunkt erstellen wie:
GET /user/all
, POST /user/add
, PUT /user/edit
und DELETE /user/delete
(was eine schlechte Praxis
- ist Ihr
RequestPathRule
und RequestMethodRule
aufrufbar mit dem einzigen erstellen oder erweitern Bedingungen, dass sie RuleInterface
und passen sie an Ihre Bedürfnisse (sehr empfehlenswert)
Wenn Sie die zweite Option wählen, müssen Sie nur diejenigen aufrufbar zum rules
Optio hinzufügen implementieren müssen n. So etwas wie dieses:
$app->add(new \Slim\Middleware\JwtAuthentication([
"rules" => [
new \My\Auth\Rules\RequestPathRule([
"path" => "/",
"passthrough" => []
]),
new \My\Auth\Rules\RequestMethodRule([
"passthrough" => ["OPTIONS"]
])
]
]));
Einverstanden. # 2 ist die beste Lösung. –