Andreas Korthaus: individuelle Fehlermeldung bei "HTTP-logout"

Hallo!

Jaja, ich weiß, das geht nicht so wie es da steht, nur mal kurz was ich mache:

Ich brauche bei einem per Basic-Auth geschützen Verzeichnis die Möglichkeit, User per Knopfdruck hier und jetzt rauszuschmeißen. Mir ist klar das es hier kein echtes Login oder Logout gibt, aber die Möglichkeit besteht trotzdem:
Ich schmeiße den User halt per Script aus der Gruppe raus, dann dürfte er beim nächten Request einen 401 bekommen.
Das Problem ist jetzt, dass ich dem User gerne eine Erklärung in Form eines inidviduellen 401 Errordocuments oder wie auch immer geben möchte, aber da der User ja jetzt keine Auth-Daten mehr mitsendet, zumindest komme ich in PHP nicht an gesendete aber abgelehnte zugangsdaten, kann ich Ihn nicht mehr erkennen, also nicht mehr von allen anderen Unterscheiden, die sich ggfs. verbotenerweise Zugang verschaffen wollen, für die habe ich das Errordocument eigentlich "reserviert".

Die Frage ist was ich jetzt machen könnte. Der User steht ja noch in der Passwortdatei, könnte man damit nicht vielleicht was machen? Halt in der htaccess prüfen, wenn der User nicht in der Gruppe vorkommt, ob der User überhaupt in der Passwortdatei steht und dann entsprechend woanders hin umleiten?
Oder ich könnte die Passwortdatei manuell per Script prüfen, aber dazu muss ich die Daten des Users haben, kann ich da irgendwie dran?

Viele Grüße
Andreas

  1. Mach doch das naheliegende: Schmeiss ihn nicht gleich aus der htaccess raus, sondern frage erst den Username ab. Ist es der gefeuerte, dann leite ihn zu einem Script um, welches seinen Username dann wirklich aus der htaccess löscht und ihm den Grund mitteilt.

    fastix®

    1. Mach doch das naheliegende: Schmeiss ihn nicht gleich aus der htaccess raus, sondern frage erst den Username ab. Ist es der gefeuerte, dann leite ihn zu einem Script um, welches seinen Username dann wirklich aus der htaccess löscht und ihm den Grund mitteilt.

      Die Idee hatte ich auch schon mal in einem anderen Zusammenhang, das Problem ist aber, wie bekomme ich den User dazu das Script aufzurufen? Ich rede davon, dass _ich_ ein Script aufrufe, welches den User aus der Gruppe löscht, also bekäme ich das angezeigt, aber ich weiß ja Bescheid ;-)
      Wie kann ich sicherstellen, das die nächte Aktion die der besagte User ausführt, der Aufruf des Scriptes ist? Wenn _ich_ ein Script starte, hat  er ab diesem Zeitpunkt keine Möglichkeit mehr eine Datei in dem Verzeichnis zu öffnen.
      Könnte man nicht vielleicht eine 2. Gruppe anlegen, und alle User dieser Gruppe auf besagtes Script leiten? Also ich entferne Ihn aus der eine Gruppe und füge Ihn in die "Logout-Gruppe" ein. Aber kann man in ein und derselben .htaccess verschiedene Gruppen untererschiedlich behandeln?

      Viele Grüße
      Andreas

      1. Mach wieder das Naheliegenste:

        Setze den User auf eine Blacklist und prüfe bei _jedem_ Seitenaufruf ob der user dort drauf steht.

        include() ist Dein Freund in der ersten Zeile aller php- skripte :)

        fastix

        1. Mach wieder das Naheliegenste:

          Setze den User auf eine Blacklist und prüfe bei _jedem_ Seitenaufruf ob der user dort drauf steht.

          include() ist Dein Freund in der ersten Zeile aller php- skripte :)

          Das schützt aber nur PHP. Ich habe auch andere Dateien auf die der User dann keinen Zugriff mehr haben darf. Die ursprüngliche Lösung ist im Prinzip perfekt, auch erheblich schöner als ein include() in jedem Script, wobei das hier ja kein Schönheitswettbewerb ist ;-)
          ODer wie wäre es denn mit einem Rewrite, gäbe es da vielleicht eien Möglichkeit auf den user zu reagieren? Nur dann müßte ich jedesmal an die htaccess :-( ODer kann ich auch eine ganze Gruppe per rewrite umleiten?

          Grüße
          Andreas

          1. Wenn es html- dateien sind: umbenennen und PHP draus machen.
            Wenn es downloads sind: Pech. Entweder schön ("Du böse"- Seite anzeigen) oder safe (Rausschmiss sofort).

            include() ist eine Lösung, die jeden Schönheitswettbewerb gewinnt. Es sei denn du bist einseitig performance- interessiert.

            1. Hallo!

              Wenn es html- dateien sind: umbenennen und PHP draus machen.

              Das kann es doch nicht sein. Außerdem ist es auch Excel, PDF...

              Wenn es downloads sind: Pech. Entweder schön ("Du böse"- Seite anzeigen) oder safe (Rausschmiss sofort).

              include() ist eine Lösung, die jeden Schönheitswettbewerb gewinnt. Es sei denn du bist einseitig performance- interessiert.

              Ich binde eh eine Datei global in alle Scripte ein, das wär nicht das Problem, nur müßte ich die Information ja irgendwie speichern, also irgendwie in einer Datei oder Tabelle, nur finde ich es halt unschön, wenn das vielleicht jeden 10.000sten Zugriff mal passiert dafür 9.999 mal "um sonst" eine Datei zu öffenen. Schön ist das wahrlich nicht! Naja, es reicht ja die Datei auf Existenz zu prüfen.

              Vielleicht hat ja noch jemand eine Idee, aber ich befürchte das es da keine Möglichkeit gibt, habe auch das Archiv nochmal durchsucht, so wie ich mir das vorstelle ist das glaube ich nicht möglich.
              Die Athentifizierung über .htaccess ist anscheinden tatsächlich nur so "primitiv" möglich wie jeder Anfänger das macht, ich dachte mal, man könnte in der .htaccess verschiedene Einstellungen für Gruppen und Unterverzeichnisse vornehmen, naja.

              Jedenfalls vielen Dank.

              Viele Grüße
              Andreas

              1. Hallo!

                Vielleicht hat ja noch jemand eine Idee, aber ich befürchte das es da keine Möglichkeit gibt, habe auch das Archiv nochmal durchsucht, so wie ich mir das vorstelle ist das glaube ich nicht möglich.

                Aber ich gebe nicht auf:

                ich habe z.B. eine htaccess wie folgt:

                AuthType Basic
                AuthName "User-Bereich"
                AuthUserFile /www/bla/bla/pass
                AuthGroupFile /www/bla/bla/groups
                Require group user

                Dann schreibe ich jetzt ein PHP Script, welches mir den User "hans" rausschmeißen soll:

                // öffne .htaccess lesend,
                // schreibe folgendes in eine Variable:

                RewriteEngine On

                RewriteCond  %{REMOTE_USER}  ^HANS$
                RewriteRule  ^.*$            /ganz/anderes/Verzeichnis  [L]

                // hänge den Inhalt der .htaccess an den String
                // schreibe alles in die .htaccess

                Das sollte doch dazu führen dass der User in das Verzeichnis "/ganz/anderes/Verzeichnis" geleitet wird.

                In das Verzeichnis kommt da dann auch eine .htaccess, die so aussieht:

                AuthType Basic
                AuthName "User-Bereich"
                AuthUserFile /www/bla/bla/pass
                Require user jemandanders

                Errordocument 401 /erklaehrung.html

                Das sollte doch dazu führen, dass der User einen 401 bekommt udn ab sofort ausgeloggt ist und auf dieses errordocument weitergeleitet wird. Dann muß das PHP Script nur noch den User aus der Gruppe entfernen und fertig.

                Aber das ist auch ganz schön gefrickelt gibts da wirklich keine _vernünftige_ Lösung für?

                Grüße
                Andreas

                1. Hallo Andreas,

                  Aber ich gebe nicht auf:

                  gut so!

                  AuthType Basic
                  AuthName "User-Bereich"
                  AuthUserFile /www/bla/bla/pass
                  AuthGroupFile /www/bla/bla/groups

                  ##»» Require group user
                  Require User name1 name2 name3 name4

                  Ich würde die User erstmal nicht aus der Passwortdatei rausschmeißen, sondern nur in der entsprechenden .htaccess aus der Require User Liste

                  Die kann man dann auch noch in Limits und Files verpacken. Habe schon gesucht. Vielleicht kommst Du damit weiter. Das einzige Dokument, dass der User dann noch öffnen darf, ist eben das Error-Dokument. Allerdings ist mir auch noch nicht klar, wie man das GET umleiten kann auf das Errordokument.

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  1. Hallo!

                    AuthType Basic
                    AuthName "User-Bereich"
                    AuthUserFile /www/bla/bla/pass
                    AuthGroupFile /www/bla/bla/groups
                    ##»» Require group user
                    Require User name1 name2 name3 name4

                    Das ist ja daselbe was ich mache, in der Datei groups steht ja:

                    User: name1 name2 name3 name4

                    und da kann ich bequem einen User rausnehmen, in der Passwortdatei bleibt alles wie es ist.

                    Die kann man dann auch noch in Limits und Files verpacken. Habe schon gesucht. Vielleicht kommst Du damit weiter. Das einzige Dokument, dass der User dann noch öffnen darf, ist eben das Error-Dokument. Allerdings ist mir auch noch nicht klar, wie man das GET umleiten kann auf das Errordokument.

                    Ja, das ist auch überhaupt kein Problem so, mit den einzigen Haken, dass ich dem User keine entsprechende Erklärung zukommen lassen kann. Das Error-Dokument ist allgemeine, zwar PHP, aber darin kann ich schon nicht mehr feststellen wer das jetz genau ist und wieso er einen 401 bekommen hat.

                    Übrigens funktinierte meien Idee aus dem vorherigen Posting nicht, denn der User hört erst auf Zugangsdaten mitzusenden, wenn er von genau dem Verzeichnis aus einen 401 erhält, der Mozilla macht das zumindest so. Wobei, eigentlich ist das ja egal, nur die 2. htaccess kann ich vergessen, der User wird auf ein anderes Verzeichnis geleitet in dem er dann die Meldung bekommt, zum selben Zeitpunkt wird er aus der Gruppe gelöscht und kann nicht mehr zurück.

                    Aber auch so ist das wirklich blöd, denn ich weiß ja nicht, wie lange das dauert, bis der user sich mal bewegt, also kann die Rewrite-Rule unter Umständen ne ganze Zeit in der .htaccess stehen, und wenn in der Zeit ein 2. User verbannt werden soll bekomme ich Probleme. Oder meint Ihr sowas könnte man vernünftig hinbekommen?

                    Viele Grüße
                    Andreas