htaccess login per php setzen

NetBull

Erfahrenes Mitglied
Hi,

ein CMS lädt einen Artikel je nach angemeldetem Benutzer. Nun sind in diesem Artikel Links zu Dateien die User ohne die speziellen Rechte nicht sehen sollen. Das klappt schon! Aber, egal wie ich es mache, wenn man die Adresse direkt eingibt kann jeder die Datei runterladen.

Ich würde gerne den Ordner mit htaccess schützen. Die Daten aus dem htaccess / passwd sind statisch auf Gruppen bezogen. Ich würde gerne das PHP die authentification für diese Session setzt. Geht das? oder wie löst man das am besten?

LG NetBu||
 
Die einfachste Möglichkeit finde ich, wenn du nicht die Adressen der betreffenden Dateien ausgibst, sondern nur eine Alias-Adresse, welche von deinem bestehenden Login-Check überprüft wird und falls der User die Rechte hat, bekommt er die Datei und wenn nicht, dann erscheint der Login oder eine Fehlermeldung.

Dabei brauchst nach dem überprüfen der Rechte keine richtige Adresse der Datei ausgeben, sondern du lädst die Datei in das Script und gibst diese aus, wodurch der Zugriff nur über die Alias-Adresse möglich ist.

Gruß Matze202.
 
Die Idee ist schon mal nicht schlecht. Mal sehen wie ich das umsetze, falls nichts anderes kommt.
Wieso kann ich nicht per PHP eine HTTP Authentifizierung setzen? Das wäre ideal. Mal sehen.
 
@Bratkartoffel :

Hi,

der Gedanke ist nicht schlecht, aber ich glaube dann geb ich passwörter zum HTACCESSS unverschlüsselt übers Netz raus, dann kann ich das auch gleich als normalen Link einbinden.
Wenig Sicherheit, wenig professionell, aber besser als gar keine Sicherheit.

Kann ich irgendwie eine PDF Datei direkt an den Client senden( im Header der Seite, so wie bei E-Mails als Anhang?)

LG NetBu||
 
boah ... es muss doch möglich sein der Session Serverseitig den htaccess user mit pass zu setzen, so das der client an die dateien darf.
 
Ich glaub ich hab was...

Harddgecodet auf dem Server
Code:
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=myfile.pdf");
readfile("/var/www/dml-joomla/templates/dmltemplate/myfile.pdf");
Vorher natürlich prüfen ob die geltende Session einen User hat...

und nun links die mit ajax den download abholen
Code:
jQuery(document).ready(function(){
        $.ajax({
            url : 'test.php',
            type : 'post'
        }).done(function (data) {
            // Bei Erfolg
            alert("Erfolgreich:" + data);
        }).fail(function() {
            // Bei Fehler
            alert("Fehler!");
        }).always(function() {
            // Immer
            alert("Beendet!");
        });
    });

Weis hier irgendjemand wie ich das object data wieder zu einem download file mache und dem browser klar mach das ich einen fortschrittsbalken brauche?
 
Hallo NetBull

Wenn du ein PDF aufrufst würde ich zuerst mal sicherstellen, dass dein Ajax-Request binär überträgt und nicht als String, sonst gehen ggf. durch Konvertierung Bytes verloren. Anschliessend kannst du daraus wieder eine lokale URL für deinen Client machen, sofern es sich bei data um einen Blob handelt:
Javascript:
var link = URL.createObjectURL(data);
var a = document.createElement('a');
a.setAttribute('href', link);
a.setAttribute('download', nameOfThePdf);
a.click();
URL.revokeObjectURL(link);

Grüsse
Cromon
 
@Cromon ::

Moin,

da bekomme ich einen Fehler...
Code:
 Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.test.html:19 (anonymous function)jquery.min.js:2 jjquery.min.js:2 k.fireWithjquery.min.js:4 xjquery.min.js:4 b

Das ist dann mein neuer PHP code:
PHP:
$file_path = '/var/www/joomla/templates/mine/documentpdf';
$file_name = 'document.pdf';
header("Content-Type: application/force-download");
//header("Content-type: application/pdf");
header('Content-Description: File Download');
header('Content-Disposition: attachment; filename=' . $file_name); 
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-length: ' . filesize($file_path));
ob_clean();
flush();
readfile($file_path);

Und das mein neuer jQuery Code:
Javascript:
jQuery(document).ready(function(){
    console.log("start request");
    $.ajax({
        url : 'test.php',
        type : 'post'
    }).done(function (data) {
        var link = URL.createObjectURL(data);
        var a = document.createElement('a');
        a.setAttribute('href', link);
        a.setAttribute('download', nameOfThePdf);
        a.click();
        URL.revokeObjectURL(link);
        console.log('finished');         
        //window.open("data:text/pdf;base64," + window.btoa(data));
    }).fail(function() {
        //alert("error!");
        console.log("error");
    }).always(function() {
        // alert("finished!");
        console.log("finished");
    });
});

Nachtrag: im Firefox ist die Meldung verständlicher:
Code:
TypeError: Argument 1 is not valid for any of the 2-argument overloads of URL.createObjectURL.
var link = URL.createObjectURL(data);

LG NetBu||
 
Zuletzt bearbeitet:
Hallo NetBull

Wie gesagt, das ganze funktioniert nur, wenn die Daten auch als Blob vorliegen. jQuery verwendet - sofern du nichts weiter machst - immer einen string für das Resultat. PDFs sind jedoch binäre Daten und bei der Konvertierung in einen String gehen dabei Informationen verloren. Verwandelst du da den String in einen Blob (via new Blob([ data ], { type: 'application/pdf' }) erhälst du nicht mehr das originale PDF. Du kannst entweder eine kleine Erweiterung von $.ajax schreiben (siehe: http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/) oder du verwendest XMLHttpRequest direkt, du kannst dort responseType entsprechend setzen, Beispiel:
Javascript:
var req = new XMLHttpRequest(); // TODO: Browserkompatibilität, da es nicht überall new XMLHttpRequest ist
req.open('GET', 'test.pdf', true);
req.responseType = 'blob';
req.onreadystatechange = function() {
    if(req.readyState == 4 && req.status == 200) {
        var url = URL.createObjectURL(req.response);
        var a = document.createElement('a');
        a.setAttribute('href', url);
        a.setAttribute('download', 'test.pdf');
        a.click();
        URL.revokeObjectURL(url);
    }
};

Viele Grüsse
Cromon
 

Neue Beiträge

Zurück