Exemple de hook_file_download

8

Comment restreindre l'accès à certains fichiers en fonction de leur type de contenu? J'ai la section de téléchargement pour les utilisateurs enregistrés et je veux les empêcher de publier des liens quelque part en dehors de mon site.

La mise en œuvre est-elle hook_file_download()suffisante?

J'ai essayé ce code et c'est suffisant pour mon but, mais la documentation de hook_file_download()n'aide pas beaucoup.

function customize_file_download($uri) {
  global $user;
  if (!array_intersect(array('administrator','editor','expert','verified'), array_values($user->roles))) {
    return 1;
   }
}
Pari
la source
Peut-être que je poste un exemple et j'espère que cela aide à le visualiser J'ai un fichier content_type avec un fichier de champ (définir la méthode de téléchargement privé) alors j'ai besoin de protéger ce fichier contre l'accès à des personnes non autorisées (en fonction du rôle de l'utilisateur)? Quelle est la meilleure approche? Vérifiez simplement que l'utilisateur a le bon rôle dans hook_file_download et c'est tout?
Pari

Réponses:

8

Il y a quelques crochets dans drupal 7 pour restreindre l'accès aux fichiers.

Une chose que vous devez comprendre est que ces hooks d'accès ne fonctionneront que si votre méthode de téléchargement est privée et que les fichiers sont dans votre chemin privé.

Comme vous le mentionnez dans votre question, il existe un hook_file_download qui devrait fonctionner dans votre cas (en supposant que le fichier est privé). Cela ne fonctionnera pas si le fichier auquel quelqu'un est lié est quelque part public tel que sites / default / files / abc123.txt.

S'il vous arrivait de télécharger ces fichiers privés dans un champ, alors hook_file_download_access semblerait plus approprié. Cela vous donnera le champ auquel appartient le fichier et également l'entité associée sur laquelle ce champ est utilisé, vous devriez donc être en mesure de faire une logique plus compliquée, comme appeler la fonction d'accès appropriée pour vérifier si l'utilisateur a accès au au lieu d'avoir une liste codée en dur dans le code.

ericduran
la source
hook_file_download avec système de fichiers privé n'invoque pas pour les utilisateurs anonymes. Une idée pourquoi?
Jeet
1
je pense que les utilisateurs anonymes ne sont pas censés accéder aux fichiers privés.
DrCord
0

Un lien vers un fichier n'est rien d'autre qu'un lien. Je ne pense pas qu'il existe un moyen de déterminer l'emplacement du lien. Vous pourrez peut-être consulter les en-têtes, mais cela ne fonctionnera probablement pas.

Si vous pouvez déterminer l'emplacement du lien vers le fichier, l'utilisation de hook_file_download sera un bon choix pour le contrôle d'accès.

googletorp
la source