Drupal 7 privát fájlok letöltése csak bejelentkezett felhasználóknak

A Google maps-es példákat hamarosan folytatom, de ezt most muszáj kiírnom magamból.

Ma órákon át téptem a hajam egy egyszerűnek tűnő probléma felett: mindössze annyit szerettem volna elérni, hogy egy Drupal 7 weboldalnál a privát tárolóba feltöltött fájlokat csak bejelentkezett felhasználók tölthessék le.

Az első ötlet, hogy erre lesz egy kis pipa a jogosultságok beállítási oldalán. Hát nincs. Némi utánajárás után kiderült, hogy a Drupal nem így működik. A fájlokhoz akkor enged hozzáférni egy felhasználót, ha az adott node-hoz van hozzáférése a felhasználónak.

Nekem nem ez kellett, a node-ot mindenkinek látni kellett, csak a fájl letöltéshez kell bejelentkezni.

Jó, gondoltam, akkor majd mező (Field) szinten kezeljük a jogosultságokat.

Meg is találtam a Field permissions modult, amivel nagyszerűen be lehet állítgani minden egyes mezőre mindenféle jogot (megtekintés, létrehozás, módosítás). Szépen beállítottam amit szerettem volna, és mint aki jól végezte dolgát, léptem is a következő feladatra.

Véletlenül vettem csak észre, hogy a weboldalról a mezőt ugyan elrejti a Field Permissions modul, de a konkrét fájlt továbbra is le lehet tölteni a megfelelő webcím (URL) ismeretében.

Ezután következett egy órákon át tartó, vad és elkeseredett kattintgatás hadjárat, mindenféle tutorial és issue olvasgatás, néhány modul kipróbálása és mindenféle mágikus varázsigék mormolása. Persze minden hiába, csak nem tudtam célt érni.

És akkor itt jön az Open Source ereje.

Nem volt más hátra, meg kellett nézni a forráskódot, hogy mégis mi a fene történik a háttérben. A megoldást, nem több mint 1 perc után megtaláltam:

  • A fájl pathból (/system/files/) sejteni lehetett, hogy a system.module-ban kell keresgéljek.
  • A system_menu függvényben meg is találtam, hogy a file_download függvény szolgálja ki ezeket a kéréseket.
  • A file.inc-ben meg is találtam a függvényt, bőséges dokumentációval. Mint kiderült létezik egy hook_file_downloads hurok, amivel szabályozható a hozzáférés.

Újabb 1 teljes percet vett igénybe a megfelelő kód megírása:

<?php
modulom_file_download
($uri) {
  if (
user_is_anonymous()) {
    return -
1;
  }
}
?>

Hát ennyi volt. Több óra kattintgatás vs. 1+1 perc kódolás. De sokszor hallottam már, hogy amit lehet, saját kód helyett érdemesebb letölthető modulokkal megoldani. Egy jó darabig még nehéz lesz engem meggyőzni erről.

6 hozzászólás

Nagyon jó cikk, köszönöm

Nagyon jó cikk, köszönöm szépen. Volt már rá példa, hogy kellett volna és nem sikerült megoldanom. Azt hiszem azonban, hogy egy apró elírás történt. A Drupal 7 file.inc 1892. sorában hook_file_download szerepel, nem pedig downloadS.

Szia!

Szia!

Nagyon jó leírás, pont erre a problémára kerestem a választ én is. És csak így elém ugrott az írásod.
A core hackelése helyett gondolkodom egy Drupal barátabb megoldáson, hogy a későbbi frissítéseknél se lehessen probléma.