Ansichtsmodul: So beschränken Sie den Zugriff durch den Benutzer

8

Ich verwende das Ansichtsmodul, um eine Ansicht zu erstellen, auf die nur bestimmte Benutzer zugreifen können sollten. Ich weiß, dass Ansichten die Zugriffssteuerung nach Rolle oder Berechtigungen beinhalten, aber ich brauche etwas Feineres: Grundsätzlich möchte ich sagen können, dass nur Benutzer "x" und Benutzer "y" auf eine bestimmte Ansicht zugreifen können (oder jemand mit eine Site-Administrator-Rolle). Dies würde also sehr ähnlich funktionieren wie das ACL-Modul für einzelne Knoten.

Ist der beste Ansatz zum Erstellen eines Plugins für den Zugriff auf benutzerdefinierte Ansichten? Ich habe nicht viel Erfahrung damit.

Außerdem frage ich mich, ob ich ein Argument mit einer Validierung verwenden soll, um dies zu erreichen (damit ich nicht Dutzende separater Ansichten erstellen muss). Da diese Ansicht beispielsweise eine Registerkarte in einem bestimmten Knotenpfad ist, frage ich mich, ob ich auf diesem Knoten ein Benutzerreferenzfeld einrichten soll, das angibt, wer die Ansicht sehen kann. Ich brauche nur eine Möglichkeit, damit die Ansicht nur überprüft, ob der aktuelle Benutzer einem im Benutzerreferenzfeld angegebenen Benutzer entspricht.

Irgendwelche Ideen? Oder mache ich das komplizierter als es sein muss?

Danke, Ben

BenK
quelle
Möglicherweise müssen Sie ein Views Access Plugin schreiben, aber wenn Sie Ihre Frage etwas detaillierter aktualisieren könnten, könnten Sie es vielleicht auf eine andere Weise erreichen. Was macht die Ansicht? Welche Benutzer dürfen es sehen? Haben die Benutzer unterschiedliche Rollen? Haben die Benutzer ein bestimmtes Feld oder etwas, das ihnen den Zugriff ermöglicht?
Jamie Hollern
Jamie, danke für die Antwort. Eigentlich benutze ich auch Drupal Commerce, um eine einzigartige Art von Online-Shop zu erstellen. Als Registerkarte auf jedem Produktknoten (zusätzlich zu den Registerkarten Anzeigen und Bearbeiten) möchte ich eine zusätzliche Registerkarte mit dem Namen "Bestellungen" erstellen, in der alle Bestellungen angezeigt werden, die dieses bestimmte Produkt enthalten haben. Der Lieferant des jeweiligen Produkts ist der Benutzer, dem die Ansicht "Bestellungen" für dieses Produkt angezeigt werden soll.
BenK
Auf diese Weise kann der Lieferant den Verkauf seines Produkts kontinuierlich überwachen. Ich möchte jedoch nicht jedem mit einer "Lieferanten" -Rolle Zugriff gewähren, da dann jeder Lieferant die Verkäufe der Produkte anderer Lieferanten anzeigen kann. Sinn ergeben? ;-)
BenK

Antworten:

5

Anstatt die Berechtigungen für die Ansicht einzuschränken, können Sie die Berechtigungen für das Menüelement einschränken, das zu dieser Ansicht führt (sei es eine Registerkarte auf einem Knoten oder ein Menürückruf). Sie können Ihre Ansicht nur mit einer "Standard" -Anzeige und ohne Seitenanzeige erstellen (Benutzer können also nicht einfach den Pfad dazu herausfinden). page callbackRufen Sie dann in Ihrem Menüpunkt einfach views_embed_viewan, um die Ansicht anzuzeigen. Es scheint, als wäre die Handhabung von Berechtigungen für einen Menüpunkt einfacher als das Schreiben eines neuen Plug-Ins für Ansichten (obwohl ein Plug-In für andere hilfreich sein könnte).

Chaulky
quelle
Danke für den Vorschlag! Am Ende folgte ich diesem allgemeinen Ansatz (der auch von Berdir vorgeschlagen wurde), erstellte jedoch auf jedem Knoten ein Benutzerreferenzfeld mit dem Namen field_usercanaccess. Ich konnte hook_menu () verwenden und einen Zugriffsrückruf definieren, der sicherstellte, dass der aktuelle Benutzer mit einem Benutzer übereinstimmt, auf den im Feld verwiesen wird. Andernfalls werden die Registerkarte (und die Ansicht) nicht angezeigt. Das funktioniert super! :-)
BenK
@ BenK super! Ich bin froh, dass etwas funktioniert. Um Drupal Answers zu einer großartigen Ressource zu machen, sollten Sie auch über Antworten (oder Fragen) abstimmen, die Sie nützlich fanden. Also sollten Sie wahrscheinlich für @ Berdirs Antwort stimmen (und meine, aber ich versuche nicht, Stimmen zu bekommen, sondern Drupal Answers zu einer besseren Seite zu machen)
Chaulky
Vielen Dank. :-) Ich bin neu bei Stack Exchange und habe nur 13 Punkte. Wenn ich versuche zu wählen, heißt es, dass ich 15 Punkte brauche, um abzustimmen. Wenn also jemand zwei Punkte übrig hat (oder ich kann sie auf andere Weise verdienen), würde ich definitiv über Antworten und Fragen abstimmen.
BenK
@ BenK oh richtig, ich habe das 15-Punkte-Limit vergessen. Sie können jederzeit versuchen, eine Frage zu beantworten ... eine positive Bewertung Ihrer Antwort erhält 10 Wiederholungen.
Chaulky
6

Probieren Sie das Views Access Callback- Modul aus.

Bietet eine auf Rückrufen basierende Zugriffssteuerung für Ansichten.

Verfügbare Rückruffunktionen werden von Modulen mithilfe der hook_views_access_callbacks()Funktion definiert (auf die gleiche Weise wie in hook_perm()) und können dann in der Konfiguration "Zugriffsbeschränkungen" der Ansicht festgelegt werden.

user5318
quelle
Die Verwendung von Views Access Callback funktioniert bis auf einen seltsamen schwerwiegenden Fehler hervorragend. Siehe hier: drupal.stackexchange.com/questions/3336/… . Es scheint der richtige Weg zu sein - aber wie kann man das beheben?
Druvision
2

Ich muss etwas vermissen, aber es klingt so, als würden Sie eine neue Rolle erstellen und diese Benutzer hinzufügen. Verwenden Sie dann die Funktion Zugriff: Rolle der Ansichten.

Wenn Sie die Zugriffsrechte an einen bestimmten Inhalt binden müssen, würde ich einen benutzerdefinierten Ansichtszugriff verwenden, bei dem ich beim ersten Einrichten Probleme hatte, aber die Flexibilität zu schätzen wissen, wenn ich einmal gearbeitet habe. Wenn die Ansicht das Menüelement generiert, wird es nicht angezeigt, wenn die Ansicht die Zugriffsfunktion nicht besteht.

Wenn Sie nur einen Menüpunkt ausblenden, scheint es mir, dass die Ansicht weiterhin ausgeführt wird und ein Benutzer einen URI optimieren kann, um die Daten anzuzeigen.

Jerry

Jerry
quelle
1

Wie wäre es, wenn Sie das Modul " Benutzerdefinierte Berechtigungen" verwenden , um einige neue Berechtigungen speziell für Ihren Zweck zu erstellen, und dann das Modul " Benutzerberechtigungen" verwenden , um diese neuen Berechtigungen einzelnen Benutzern zuzuweisen?

Das Modul für benutzerdefinierte Berechtigungen ist sehr leicht. Ich bin mir jedoch nicht so sicher, was das Benutzerberechtigungsmodul angeht, da es im Wesentlichen für jeden Benutzer hinter den Kulissen eine neue Rolle erstellt (diese Rollen sind auf der Hauptberechtigungsseite nicht sichtbar). Wenn Sie viele Benutzer haben, kann dies die Größe Ihrer Rollen und user_roles-Tabellen etwas erhöhen.

Tom Kirkpatrick
quelle
Dies ist ein interessanter Vorschlag zur Verwendung benutzerdefinierter Berechtigungen. Ich hatte dieses Modul nicht gesehen, da es breiter wurde als nur Site Config-Berechtigungen. Die einzige Komplikation hier ist, dass ich das alles in Drupal 7 mache (und es gibt noch keinen offiziellen Zweig). Wenn dies jedoch funktioniert, kann die Berechtigung möglicherweise direkt in der Zugriffssteuerung der Ansicht angegeben werden (ohne dass das Modul "Benutzerberechtigungen" erforderlich ist). Danke für den Vorschlag! :-)
BenK
Ich werde das ausprobieren und mich melden.
BenK
0

Richtig, das macht mehr Sinn. Ich denke, Sie könnten (möglicherweise nicht 100% sicher) eine Ansicht und ein Argument verwenden. Legen Sie das Argument als Benutzer-ID fest, die dem aktuell angemeldeten Benutzer entnommen wurde, und lassen Sie das Standardargument nichts anzeigen. Das sollte es können, obwohl ich nicht weiß, wie sicher es wäre, fair zu sein. Wenn Sie es versuchen, schreiben Sie zurück und teilen Sie mir Ihre Fortschritte mit.

Jamie Hollern
quelle
Ja, ich werde es versuchen und mich zurückmelden. Ich versuche auch ein Views Access Plugin mit einem Argument, also werden wir sehen, wie es geht. Vielen Dank.
BenK
0

Wenn Sie verschiedene Zugriffs-Plugins in Views kombinieren möchten, sollten Sie sich das Modul Views access many ansehen .

Steven Jones
quelle