Beispiel für hook_file_download

8

Wie beschränke ich den Zugriff auf bestimmte Dateien basierend auf ihrem Inhaltstyp? Ich habe den Download-Bereich für registrierte Benutzer und möchte verhindern, dass diese Links irgendwo außerhalb meiner Website veröffentlichen.

Ist die Implementierung hook_file_download()ausreichend?

Ich habe diesen Code ausprobiert und er reicht für meinen Zweck, aber die Dokumentation von hook_file_download()hilft nicht viel.

function customize_file_download($uri) {
  global $user;
  if (!array_intersect(array('administrator','editor','expert','verified'), array_values($user->roles))) {
    return 1;
   }
}
Pari
quelle
Vielleicht poste ich ein Beispiel und hoffe, dass es hilft, es zu visualisieren. Ich habe eine Datei content_type mit einer Felddatei (private Download-Methode festlegen). Dann muss ich diese Datei vor dem Zugriff auf unbefugte Personen schützen (basierend auf der Benutzerrolle). Was ist der beste Ansatz? Überprüfen Sie einfach, ob der Benutzer die richtige Rolle in hook_file_download hat, und das ist alles?
Pari

Antworten:

8

In Drupal 7 gibt es einige Hooks, um den Zugriff auf Dateien einzuschränken.

Eine Sache, die Sie beachten müssen, ist, dass diese Zugriffshooks nur funktionieren, wenn Ihre Download-Methode privat ist und sich die Dateien in Ihrem privaten Pfad befinden.

Wie Sie in Ihrer Frage erwähnen, gibt es einen hook_file_download , der in Ihrem Fall funktionieren sollte (vorausgesetzt, die Datei ist privat). Dies funktioniert nicht, wenn die Datei, auf die jemand verlinkt, öffentlich ist, z. B. sites / default / files / abc123.txt.

Wenn Sie diese privaten Dateien zufällig in ein Feld hochladen , erscheint hook_file_download_access angemessener. Auf diese Weise erhalten Sie das Feld, zu dem die Datei gehört, sowie die zugehörige Entität, für die dieses Feld verwendet wird, sodass Sie in der Lage sein sollten, eine kompliziertere Logik auszuführen, z. B. die entsprechende Zugriffsfunktion aufzurufen, um zu überprüfen, ob der Benutzer Zugriff auf die Datei hat Feld anstelle einer fest codierten Liste im Code.

Ericduran
quelle
hook_file_download mit privatem Dateisystem wird für anonyme Benutzer nicht aufgerufen. Irgendeine Idee warum?
Jeet
1
Ich denke, weil anonyme Benutzer nicht auf die privaten Dateien zugreifen sollen.
DrCord
0

Ein Link zu einer Datei ist genau das - ein Link. Ich glaube nicht, dass es eine Möglichkeit gibt, den Ort des Links zu bestimmen. Möglicherweise können Sie sich Header ansehen, aber dies wird wahrscheinlich nicht funktionieren.

Wenn Sie den Speicherort des Links zur Datei bestimmen können, ist die Verwendung von hook_file_download eine gute Wahl für die Zugriffssteuerung.

googletorp
quelle