Autorisierung und Richtlinien für Gastbenutzer

8

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:

%Vor%

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?

    
Pistachio 10.02.2016, 14:29
quelle

2 Antworten

2

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:

%Vor%

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.

    
tdhsmith 26.07.2016 20:38
quelle
1

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.

    
jrseliga 16.11.2016 18:39
quelle

Tags und Links