Tom3: Zugriff auf Flash-Videos benutzerabhängig steuern

Hallo,

für eine eher private Website suche ich nach einer Variante, wie ich den Zugriff auf Flash-Videos abhängig vom Nutzer einschränken kann. Wenn sich Nutzer A einloggt, dann soll er Video 1, 2 und 3, Nutzer B soll Video 1 und 4 sowie Nutzer C dann z.Bsp. Video 2, 3 und 4 sehen dürfen.

Die Frage ist, wie ich den Zugriff auf die Videos abhängig vom eingeloggten Nutzer am sinnvollsten regeln kann. Geplant ist, dass der Login über ein sessionbasiertes Loginscript funktioniert. Da die Videos (werden über http mittels Flowplayer) abgespielt werden sollen, liegen diese quasi im direkt zugänglichen Bereich. Bilder beispielsweise kann ich ja nochmal über ein PHP-Script ausliefern (und darin der eingeloggten Nutzer prüfen), aber wie soll ich dies bei FLV-Dateien machen? Die sind im Extremfall 120 MB groß und laufen bis zu acht Minuten, kann ich doch nicht über ein Script laufen lassen?!

Vielen Dank für Eure Lösungsansätze!

Ciao, Tom

PS: Man könnte quasi mit PHP dynamisch eine htaccess-Datei erzeugen (worin dann die Zugriffsrechte der Nutzer auf die einzelnen Dateien geregelt sind), aber einerseits will ich eigentlich das typische "htaccess-Loginfenster" vermeiden und andererseits habe ich jetzt schon ca. 200 Videodateien ...

  1. hi,

    [..] Da die Videos (werden über http mittels Flowplayer) abgespielt werden sollen, liegen diese quasi im direkt zugänglichen Bereich.

    Da würde ich ansetzen: .htaccess erstmal auf die Ressource. Damit der Player darauf zugreifen kann, muss der jedoch einen zusätzlichen HTTP-Header senden, der sieht so aus:

    Authorization: Basic $credentials

    Wobei: $credentials = encode_base64('benutzername:passwort');

    Wichtig: encode_base64() je nach Programmiersprache so einsetzen, dass am Ende kein Zeilenumbruch kommt, oder den Zeilenumbruch beim Senden des Headers berücksichtigen. In Perl kannst Du mit

    encode_base64('benutzername:passwort', '');
                                            ^ hiermit

    das default "\n" am Ende entfernen und bekommst für den Header klare Verhältnisse. Die $credentials selbst können unabhängig von denen der Besucher sein.

    Hotti

    1. Hallo Hotti,

      Da würde ich ansetzen: .htaccess erstmal auf die Ressource. Damit der Player darauf zugreifen kann, muss der jedoch einen zusätzlichen HTTP-Header senden, der sieht so aus:

      Authorization: Basic $credentials

      lese ich raus, dass der Player den senden könn. Kann ich so leider nicht realisieren, da schlichtweg meine Kenntnisse nicht ausreichen, um einen eigenen Player zu programmieren.

      Eine Idee (?) von mir war, dass beim Login des Nutzers die erlaubten Dateien in ein temporäres Verzeichnis (zufälliger Name) kopiert werden und dann der Player die Videos von dort holt. Ist aber bei der Anzahl und Größe der Dateien vielleicht nicht so toll ...

      Oder könnte ich z.Bsp. mit PHP sowas wie "symbolische Links" auf dem Server erzeugen. D.h. abhängig vom Nutzer wird auf dem Server der Link http://example.org/zufal1243123/video.flv erzeugt, beim Zugriff darauf wird aber das Video ausgeliefert (was nicht direkt über http erreichbar ist)?

      Ciao, Tom

  2. für eine eher private Website suche ich nach einer Variante, wie ich den Zugriff auf Flash-Videos abhängig vom Nutzer einschränken kann. Wenn sich Nutzer A einloggt, dann soll er Video 1, 2 und 3, Nutzer B soll Video 1 und 4 sowie Nutzer C dann z.Bsp. Video 2, 3 und 4 sehen dürfen.

    jetzt habe ich mal ein größeres Video über ein Script mittels readfile() ausgegeben, funktioniert scheinbar soweit auch. Allerdings habe ich hier nur einen relativ schnellen Internetanschluß, was wäre z.Bsp. wenn das Video 10 Minuten lang ist und auch fast solange geladen wird. Bricht PHP dann den Vorgang irgendwann ab?

    Ciao, Tom

    1. moin,

      jetzt habe ich mal ein größeres Video über ein Script mittels readfile() ausgegeben, funktioniert scheinbar soweit auch. Allerdings habe ich hier nur einen relativ schnellen Internetanschluß, was wäre z.Bsp. wenn das Video 10 Minuten lang ist und auch fast solange geladen wird. Bricht PHP dann den Vorgang irgendwann ab?

      Du meinst beim Senden? Warum sollte PHP abbrechen, solange noch Bits und bytes unterwegs sind?

      Hotti

      PS: So kommt ein (Endlos) Stream beim User an:
        http://rolfrost.de/rtsp.html

      1. Hallo Hotti,

        jetzt habe ich mal ein größeres Video über ein Script mittels readfile() ausgegeben, funktioniert scheinbar soweit auch. Allerdings habe ich hier nur einen relativ schnellen Internetanschluß, was wäre z.Bsp. wenn das Video 10 Minuten lang ist und auch fast solange geladen wird. Bricht PHP dann den Vorgang irgendwann ab?

        Du meinst beim Senden? Warum sollte PHP abbrechen, solange noch Bits und bytes unterwegs sind?

        in der Tat, scheint zu klappen. Jetzt verstehe ich php.net/max_execution_time wohl erst richtig, dieser Fall tritt ein, wenn keine Daten mehr fließen. Ich habe jetzt mal mit Sloppy einen Download mit 128k gestartet, die Datei ist 117 MB groß und es scheint zu klappen. Läuft jetzt seit 10 Minuten ... schon schlimm, wie langsam das Internet früher war ;-)

        Ciao, Tom

        PS: Falls es Einwände gibt, warum readfile() hier nicht ok ist und wie es anders (besser) lösbar wäre, dann nur her damit. Auf dem jetztigen Weg kann ich jedenfalls benutzerabhängig den Zugriff auf die Dateien regeln, also von meiner Seite wäre es aktuell ok und sicher sollte es doch auch sein?!

        1. Moin (Mahlzeit),

          PS: Falls es Einwände gibt, warum readfile() hier nicht ok ist

          Du liest die Mediadatei damit ein und gibtst die aus als Response. Das ist völlig in Ordnung (Einwand-frei). Wichtig ist:

          der richtige Content-Type-Header (HTTP)
           binmode STDOUT;

          Der binmode() ist wichtig, damit bei einem print() der Byte-Stream sozusagen zusammenbleibt (mal einfach ausgedrückt).

          Schönen Sonntag,
          Horst Schlemmerfrühstück

          1. Moin!

            PS: Falls es Einwände gibt, warum readfile() hier nicht ok ist

            Du liest die Mediadatei damit ein und gibtst die aus als Response. Das ist völlig in Ordnung (Einwand-frei). Wichtig ist:

            der richtige Content-Type-Header (HTTP)
            binmode STDOUT;

            Der binmode() ist wichtig, damit bei einem print() der Byte-Stream sozusagen zusammenbleibt (mal einfach ausgedrückt).

            Bei Perl vielleicht. Davon ist hier nicht die Rede.

            - Sven Rautenberg

            1. Mahlzeit,

              Der binmode() ist wichtig, damit bei einem print() der Byte-Stream sozusagen zusammenbleibt (mal einfach ausgedrückt).

              Bei Perl vielleicht. Davon ist hier nicht die Rede.

              Ich finde meinen Hinweis auf binmode() schon wichtig. Unabhängig von einer Programmiersprache. Ein Blick in das IO-Verhalten vermeidet nämlich unliebsame Überraschungen, die sich auch so äußern können, dass es mal geht und mal nicht. Und ein Leitsatz in der IT heißt: Wenn was schiefgehen kann, geht es schief. Zum Beipiel der Fakt, dass eine Funktion, die auf STDOUT ausgibt, ein bischen von der Plattform abhängig ist und Bitfolgen, die nach einem Zeilenumbruch aussehen, entsprechend behandelt.

              Schöne Grüße,
              Horst Sternschnuppe

              --
              Ich hatte nicht vor zu Schießen, aber der Lümmel läuft mir andauernd ins Schussfeld ;-)
              1. Hi,

                Der binmode() ist wichtig, damit bei einem print() der Byte-Stream sozusagen zusammenbleibt (mal einfach ausgedrückt).
                Bei Perl vielleicht. Davon ist hier nicht die Rede.
                Ich finde meinen Hinweis auf binmode() schon wichtig. Unabhängig von einer Programmiersprache.

                nein, im Gegenteil: Er bekommt erst einen Sinn, *wenn* man sich auf eine Programmiersprache bzw. eine bestimmte Standardsoftware festlegt. Auf OS-Ebene gibt es diesen Unterschied nämlich nicht, da ist alles "binary". Den Unterschied machen erst manche Runtime-Umgebungen, zum Beispiel die Standardbibliotheken von C oder anscheinend auch Perl. Oder FTP-Clients.

                Und ein Leitsatz in der IT heißt: Wenn was schiefgehen kann, geht es schief.

                Eine fast wörtliche Übersetzung von Murphy's Law: "Anything that can go wrong will go wrong."

                So long,
                 Martin

                PS: Was ist das eigentlich für ein Unsinn, den Google seit einigen Tagen treibt? Noch vor etwa zwei Wochen wäre der oben angegebene Link zur Wikipedia *exakt* das gewesen, was auch Google verlinkt. Jetzt linkt Google stattdessen auf die Monster-URL http://www.google.de/url?q=http://en.wikipedia.org/wiki/Murphy's_law&sa=U&ei=ST-vS4y7FYiXsQbW25S1Dg&ct=res&ved=0CAsQFjAA&cd=1&usg=AFQjCNE8l-JcCymP_dOFcB76jZHSkk-1Fw, die mit einem 302-Redirect auch wieder auf die eigentlich gesuchte Ressource weiterleitet. Wozu der Quatsch?

                --
                Politik ist die Kunst, die Menschen so zu bescheißen, dass sie auch noch glauben, sie hätten das selbst so gewollt.
                1. Hi,

                  PS: Was ist das eigentlich für ein Unsinn, den Google seit einigen Tagen treibt?

                  Noch eher frag' ich mich, was für einen Unsinn mein Opera (10.51) damit treibt:

                  Noch vor etwa zwei Wochen wäre der oben angegebene Link zur Wikipedia *exakt* das gewesen, was auch Google verlinkt. Jetzt linkt Google stattdessen auf die Monster-URL http://www.google.de/url?q=http://en.wikipedia.org/wiki/Murphy's_law&sa=U&ei=ST-vS4y7FYiXsQbW25S1Dg&ct=res&ved=0CAsQFjAA&cd=1&usg=AFQjCNE8l-JcCymP_dOFcB76jZHSkk-1Fw, die mit einem 302-Redirect auch wieder auf die eigentlich gesuchte Ressource weiterleitet.

                  Nachdem ich den Link ein mal besucht habe und umgeleitet wurde, packt mir Rechtsklick->Copy Link Address auf den von dir gesetzten Link gleich die Adresse http://en.wikipedia.org/wiki/Murphy's_law in die Zwischenablage - wtf? In der Statuszeile zeigt er mit hingegen beim Überfahren des Links die Google-Adresse an.
                  Das soll vermutlich ein nützliches Feature sein, aber irgendwie überzeugt mich das gerade nicht besonders.

                  MfG ChrisB

                  --
                  “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]