Pyramide: Prüfen Sie bei einem Routennamen auf Erlaubnis

8

Es ist nicht schwer zu überprüfen für die Erlaubnis einer bestimmten Ressource in Pyramid. Ich würde gerne wissen, wie man den Berechtigungstyp und die Ressource, die einer bestimmten Route entsprechen, bestimmt.

Details. Angenommen, ich habe eine Route hinzugefügt

%Vor%

wobei FactoryFactory eine Funktion ist, die eine Factory zurückgibt. In diesem Fall gibt es eine Factory für "Ressourcen" zurück, was auch immer das sein mag. Später gehe ich dann so:

%Vor%

Irgendwann werde ich auf der Website ein Eingabeelement generieren, das mit

verknüpft wird %Vor%

Bearbeiten: Wie gewünscht, gebe ich Ihnen den genauen Vorlagencode, in der Hoffnung, dass Sie dadurch die Situation besser verstehen. Die Vorlagen-Engine, die wir verwenden, ist Chameleon.

%Vor%

Nun, was ich möchte, ist etwa so:

%Vor%

Mit anderen Worten: Ich möchte dieses Eingabeelement only anzeigen, wenn der Benutzer die Berechtigung zum Ausführen der Bearbeitungsoperation an erster Stelle hat.

Nun, ich kann Ihnen ein Beispiel dafür geben, was funktionieren würde, aber für mich unattraktiv ist, weil es unflexibel ist. Ich kodiere eine Hilfsfunktion

%Vor%

und dann schreibe ich

%Vor%

Das ist mir unattraktiv, weil die Informationen über die Fabrik und die Informationen über die Erlaubnis in die Route einprogrammiert haben, also fühle ich mich in der Lage, auf sie zuzugreifen, indem ich einfach zur Verfügung stelle der Name der Route .

Daher suche ich nach einer Möglichkeit, die Ressource und die Berechtigung von nur den Routeninformationen zu erhalten, d. h. aus der Zeichenfolge 'resource.edit' und der Ressourcen-ID some_input . Ist das möglich? Wenn ja, wie?

Vielen Dank im Voraus.

    
Jesko Hüttenhain 04.01.2014, 21:04
quelle

5 Antworten

3

Auf Ihre Frage:

  

Deshalb suche ich nach einer Möglichkeit, die Ressource und die   Erlaubnis von nur der Routeninformation, d. h. von der Kette   'resource.edit' und die Ressourcen-ID some_input. Ist das möglich? Ob   ja, wie?

Pyramid kann nicht wissen, ob ein Benutzer (aktuelle Anfrage) auf Ihre Ressource zugreifen kann, bevor Sie eine Ressource bereitstellen. Sie können auf

verweisen

Zuweisen von ACLs zu Ihrer Ressource Objekte

Wie Sie sehen können, untersucht Pyramid die __ACL__-Attribute Ihres Ressourcenobjekts (und __ACL__ des Vorgängers der Ressource) und bestimmt dann, wer welche Art von Berechtigungen für diese Ressource hat. Daher ist es mit der Standardautorisierung von Pyramid nicht möglich Politik.

Um Ihr Problem zu lösen, können Sie entweder AuthorizationPolicy , machen Sie Ihre eigene Autorisierungsregel, oder Sie können die Erstellung der Ressource von ID leicht machen.

Denken Sie darüber nach, wenn Sie ein owner -Feld der entsprechenden Tabelle für die Ressource haben und prüfen müssen, ob der aktuelle Benutzer der Besitzer einer bestimmten Ressource ist, müssen Sie diese Ressource trotzdem aus der Datenbank holen. Sie müssen also eine Ressource erstellen, die sowieso __ACL__-Attribute bereitstellt. Also, mein Vorschlag hier ist, machen Sie das Erstellen der Ressource viel einfacher, machen Sie es so etwas Resource(res.id) , so dass Sie Ihre Vorlage wie folgt schreiben können

%Vor%

Aktualisieren

Dann denke ich, was Sie brauchen, ist, introspector zu verwenden, um die Fabrik zu erhalten und die Ressource so zu erstellen

%Vor%     
Fang-Pen Lin 13.01.2014, 05:45
quelle
3

Wenn Sie die Factory aus der Route extrahieren möchten, verwenden Sie die Pyramidenintrospektion

%Vor%

Finden Sie mehr über Introspektion hier .

    
Sascha Gottfried 13.01.2014 12:27
quelle
1

Um Ihre Frage zu beantworten: Nein, Sie erhalten keine Informationen über die Berechtigung einer Route. Routen stimmen nur mit Ansichten überein. Ansichten und Ressourcen können auf sehr unterschiedliche Weise mit Berechtigungen geschützt werden. Ihre Sicherheitsrichtlinie bezieht sich normalerweise auf Benutzer, Ressourcen und Ansichten - nicht auf Routen.

Vielleicht kann dieser Vorschlag Ihnen helfen.

Gegeben diese Route zu einer Ressource

%Vor%

Sie erstellen eine Ansicht, die dieser Route entspricht. Die Routenfabrik wird die Ressource als einen Kontext herstellen. Encapsulate permission related code in der Ansicht .

%Vor%

Innerhalb Ihrer Vorlage verwenden Sie "can_edit", um die Sichtbarkeit dieses Links oder eines anderen Markups zu kontrollieren.

%Vor%

Sie können das Beispiel verbessern, indem Sie die URL berechnen, um die Ressource auch im Ansichtscode zu bearbeiten.

%Vor%

Dies führt zu einem kompakten Template-Code und verbessert die Testbarkeit des View-Codes.

%Vor%

Um den Code für jeden Pyramidenentwickler allgemeiner zu machen, möchte ich die Framework-Option verwenden, um den Kontext aus der Anfrage zu erhalten.

%Vor%

In Bezug auf Ihre Anwendung möchte ich diese Pyramiden-Beispiel-Apps empfehlen:

Sascha Gottfried 12.01.2014 19:49
quelle
0

Hast du jemals ...

benutzt

Ссылка

Innerhalb dieses können Sie leicht auf spezifische Benutzerrechte prüfen, also können Sie entweder in Ihrer Schablone oder in Ihrem Code eine Benutzerberechtigung leicht filtern.

%Vor%

Dann in der Vorlage (Jinja2 Beispiel gezeigt) können Sie tun:

%Vor%

Oder wenn Sie eine Benutzerabfrage durchführen, können Sie einfach eine Verknüpfung mit Ihrer aktuellen Abfrage verknüpfen.

    
Crooksey 06.01.2014 12:44
quelle
0

Sie können die Berechtigung für die Ressource speichern (dauerhaft oder nur als Attr der Klasse):

%Vor%

PS: Ich habe das obige nicht ausgeführt, aber eine Variante des obigen sollte funktionieren.

    
iElectric 07.01.2014 14:32
quelle