FileShare pro přihlášené uživatele bez použití DB
- Joacim
- Člen | 229
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
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
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
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.
- Joacim
- Člen | 229
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
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.
- Joacim
- Člen | 229
Zkusil jsem to nakonec udělat takto:
- Samba share je mimo /var/www/html/PROJEKT → /home nebo /var (Documents), kde je na složku chmod777
- ke každému filu, který mám v jsonu generuji hash, který je pak v odkazu n:href (server/files)
- 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)