Fall: Ich baue ein Forum mit Laravel-Autorisierung als Backbone unter Verwendung von Richtlinien. Beispiele für Prüfungen, die ich ausführe, sind Sachen wie @can('view', $forum)
und @can('reply', $topic)
, Gate::allows('create_topic', $forum)
usw. Diese Prüfungen überprüfen im Grunde, ob die Benutzerrolle diese Berechtigung für das spezifische Forum, Thema oder Post hat. Auf diese Weise kann ich Rollen für jedes Forum in meiner Anwendung sehr spezifische Berechtigungen geben.
Das Problem besteht darin, dass alle diese Prüfungen die Klasse "Gate" durchlaufen, genauer gesagt eine Methode namens " raw()
", die in ihrer ersten Zeile Folgendes ausführt:
Dies stellt ein Problem beim Umgang mit Foren dar. Gästen meiner Anwendung sollte es ebenfalls erlaubt sein, mein Forum zu sehen. Wie Sie jedoch aus dem obigen Code sehen können, gibt die Laravels Gate-Klasse automatisch false zurück, wenn der Benutzer nicht angemeldet ist.
Ich muss meine Richtlinien auch dann auslösen können, wenn kein Benutzer vorhanden ist. In meiner ForumPolicy@view
Methode sage ich if(User::guest() && $forum->hasGuestViewAccess()) { return true }
Aber wie Sie sehen können, wird diese Methode niemals ausgelöst.
Gibt es eine Möglichkeit für mich, die Autorisierungsfunktion von Laravel weiterhin mit Gastbenutzern zu verwenden?
Ich bin mir nicht bewusst, dass dies ein sehr natürlicher Weg ist, aber wenn es notwendig ist, könnten Sie den User Resolver des Gate ändern, der für die Suche nach Benutzern zuständig ist (standardmäßig liest er von%) co_de%).
Da der Resolver geschützt ist und keine Setter hat, müssen Sie ihn beim Erstellen modifizieren. Das Tor wird in Laravels Auth::user()
instanziiert. Sie können diese Klasse erweitern und den Verweis darauf in der AuthServiceProvider
config durch Ihre Unterklasse ersetzen.
Es hängt von Ihnen ab, welche Art von Gastobjekt zurückgegeben werden soll (solange es truthig ist), aber ich würde wahrscheinlich so etwas wie ein leeres app.providers
-Modell verwenden:
Sie könnten einen Schritt weiter gehen und eine spezielle Eigenschaft wie User
festlegen oder sogar eine spezielle Gastklasse oder -konstante definieren.
Alternativ können Sie Ihren Prozess auf der Ebene $user->isGuest
anpassen, sodass alle ausgeloggten Sitzungen in einen Aufruf von Auth
eingeschlossen werden.
Ich habe gerade ein Paket veröffentlicht, mit dem die Berechtigungslogik auf Gastbenutzer angewendet werden kann. Es ändert leicht die Laravel-Berechtigung, um ein Guest
-Objekt anstelle von null
zurückzugeben, wenn kein Benutzer aufgelöst wird. Außerdem wird jetzt jede Berechtigungsprüfung an das Gate gesendet, anstatt sofort die Autorisierung zu unterbrechen, da kein authentifizierter Benutzer vorhanden ist.
Tags und Links php laravel-5 laravel laravel-5.1