FileShare pro přihlášené uživatele bez použití DB

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Joacim
Člen | 229
+
0
-

Zdravím,

mám dotaz ohledně možnosti zpřístupnění složky jen přihlášeným uživatelům (mimo www/).
V nette se dostanu klasicky do www/*, ale nelze zde ošetřit přístup jen pro přihlášené uživatele, musí být pro složku např: www/Documents nastaven .htaccess PWD (což je sice bezpečný přístup pokud je na webu SSL, co jsem se dočetl), ale není zcela komfortní.
Pokud zadám www.test.cz/Documents/nazev.pdf, tak se k němu dostane každý z internetu a jediný způsob který znám je přávě heslo .htaccess.
Pro zobrazení souborů mám FilesPresenter, který pracuje na principu php scanu adresáře a odesílá přes ajax, json JS, který se stará o vykreslení složek (cute-file-browser).

DB nepoužívám, jelikož pro přístup ke složce Documents se používá SAMBA. Tedy mám nastavený share na www/Documents.

Napadla mě varianta s .htaccess, (přesměrování přes presenter www.test.cz/files/nazev.pdf), nevím zda to jde, nejsem expert na .htaccess.
Nebo v app/ mít složku Documents, která by byla přístupná jen přihlášeným uživatelům, ovšem nevím jak to udělat a jestli to vůbec jde.

Primárním cílem je udělat složku, kterou vidí uživatel přihlášený, ale nemusí zadávat .htaccess heslo.

Budu rád za každý nápad, radu i popostrčení.

Editoval Joacim (19. 2. 2016 10:38)

Mysteria
Člen | 797
+
+1
-

Jestli jsem to pochopil správně a chceš přihlášeným uživatelům umožnit stahovat soubory, které ale nemají být veřejné, tak já jsem to řešil tak, že prostě je mám někde, kam je zakázaný přístup přes .htaccess. V aplikaci je pak klasicky vylistuju a jejich stahování řeší PHP. Tzn. žádný přímý odkaz na soubor, ale klasicky FileResponse. Problém tohohle řešení je ten, že každý takový download spotřebuje PHP proces, což znamená, že když máš velký soubor a hosting toto limituje, tak třeba pouze 5 uživatelů bude moct naráz stahovat soubor a zbytku nepůjde ani web, dokud jeden z nich nedokončí stahování. Ale pro malé soubory nebo vlastní server, kde lze maximální počet procesů změnit mi tohle řešení vyhovuje.

Joacim
Člen | 229
+
0
-

Mysteria napsal(a):

Jestli jsem to pochopil správně a chceš přihlášeným uživatelům umožnit stahovat soubory, které ale nemají být veřejné, tak já jsem to řešil tak, že prostě je mám někde, kam je zakázaný přístup přes .htaccess. V aplikaci je pak klasicky vylistuju a jejich stahování řeší PHP. Tzn. žádný přímý odkaz na soubor, ale klasicky FileResponse. Problém tohohle řešení je ten, že každý takový download spotřebuje PHP proces, což znamená, že když máš velký soubor a hosting toto limituje, tak třeba pouze 5 uživatelů bude moct naráz stahovat soubor a zbytku nepůjde ani web, dokud jeden z nich nedokončí stahování. Ale pro malé soubory nebo vlastní server, kde lze maximální počet procesů změnit mi tohle řešení vyhovuje.

Přesně něco takového hledám, problém je že url pro download např: pdf mi generuje JS. Můžu se zeptat jak si řídíš stáhnutí souboru ? Vlastní server mám.

Mysteria
Člen | 797
+
+1
-

No já mám normálně DownloadPresenter, kde je metoda actionList, který projde složku se souborama a klasicky pomocí šablony vypíše. No a odkaz vede na actionDownload($path), kde $path je normálně cesta k tomu danému souboru v filesystému, kde už to odešlu pomocí té FileResponse.

Milan Obrtlík
Člen | 50
+
0
-

Dalo by se to řešit pomocí CDN?

Joacim
Člen | 229
+
0
-

Mysteria napsal(a):

No já mám normálně DownloadPresenter, kde je metoda actionList, který projde složku se souborama a klasicky pomocí šablony vypíše. No a odkaz vede na actionDownload($path), kde $path je normálně cesta k tomu danému souboru v filesystému, kde už to odešlu pomocí té FileResponse.

Díky, zkusím na tom zapracovat

Tomáš Jacík
Člen | 147
+
0
-

Dá se to řešit přes mod_auth_token. V aplikaci vygeneruješ token, a s ním přesměruješ uživatele na konkrétní soubor. Download pak řeší přímo webserver.

Myiyk
Člen | 321
+
0
-

Taky se dá udělat, že vygeneruješ symlink na stahovaný soubor.

Výhodou/nevýhodou je, že se dá poslat odkaz na soubor i někomu jinému.

Stejným způsobem fungují fotky na Facebooku.

Joacim
Člen | 229
+
0
-

Zkusil jsem to nakonec udělat takto:

  1. Samba share je mimo /var/www/html/PROJEKT → /home nebo /var (Documents), kde je na složku chmod777
  2. ke každému filu, který mám v jsonu generuji hash, který je pak v odkazu n:href (server/files)
  3. actionDefault zachytí AJAY request a podle hashe najde soubor a nabídne ke stažení

Bohužel, tato poslední část moc nefunguje jelikož mi nefunguje stažení aby po kliknutí na odkaz vyskočil forcedownload a nabídnul uživateli dialogové akno systému(prohlížeče) s nabídkou k pojmenovaní a uložení souboru

$file = $this->dir_public . $filePole['path'];
            $name = basename($file);
            $httpResponse = $this->presenter->getHttpResponse();
            $httpResponse->setContentType('application/force-download');
            $httpResponse->setContentType('application/octet-stream');
            $httpResponse->setContentType('application/download');

            $httpResponse->setHeader('Content-Disposition', 'attachment; filename="' . $name . '"');
            $httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
            $httpResponse->setHeader('Cache-Control', 'private');
            $httpResponse->setHeader('Expires', '0');
            $httpResponse->setHeader('Expires', '0');
            $httpResponse->setHeader('Connection', 'close');
            $handle = fopen($file, 'r');
            $httpResponse->sendResponse(new Nette\Application\Responses\FileResponse($handle, $name, array('application/octet-stream', 'application/force-download', 'application/download')));
            //$contents = fread($handle, filesize($file));
            ob_clean();
            flush();
            fpassthru($handle);

V chromu se soubor hned uloží, ve FF se objeví dialogové okno, myslel jsem si že je to nastavením prohlížeče, ale např STAG (VS STAG), vyzve také k uložení i v Chromu tedy nějako to jít musí

Editoval Joacim (22. 2. 2016 12:25)