Matze: PHP Session Teilen. knifflig!

Guten Morgen.

Es geht um eine Webapplikation die in einem lokalen Netzwerk läuft und nur intern verfügbar ist.

UserA loggt sich auf dem Client ein, bekommt eine Session und arbeitet. Gewisse Daten werden in seine Session geschrieben etc...

Jetzt möchte sich aber UserA auf einer anderen Station einloggen und sozusagen die Session wieder übernehmen.

Gibt es irgend eine Möglichkeit wie ich Sessions teilen kann?

Zudem darf nur ein User aktiv sein in der Webapplikation.

Am genialseten wäre, wenn ich den Apache oder die PHP conf so konfigurieren könnte, dass es die Session immer mit dem selben Namen generiert. Ist das möglich?

Sicherheits Aspekte sind zu vernachlässigen, da es vorerst ein Test ist und falls produktiv nur intern verwendet würde...

Anyway ich hoffe, dass ihr mir vielleicht ein paar Gedankenstösse geben könnt.

Besten Dank
Matze

  1. Hallo Matze,

    differenziere zwischen dem Speicherbereich, den jeder Client zur Sicherung seines Zustandes benötigt und dem Speicherbereich, den die bearbeiteten Vorgänge benötigen.

    Jeder Vorgang hat seine
      Ausgangsposition          Stammdaten, Rahmendaten beim Eintritt
      Entwicklungsstufen        Bewegungsdaten, unfertige Teilarbeitsschritte
      Endstadium                   Fertiger Vorgang oder abgrenzbarer Teil davon

    Du kannst nicht an jeder beliebigen Stelle einfach übernehmen, da Du den genauen Zustand der gerade bearbeiteten Daten immer nur zu dedizierten Punkten vorhersagen kannst. Ein Eingriff an beliebiger Stelle würde die Integrität Deiner Daten gefährden.

    Sessionnummern können wieder zugewiesen werden, halte ich aber für Deine Aufgabenstellug nicht für relevant. Welche FILES (oder Datensätze in der DB) zu teilen sind, kann Deine Applikation aber frei bestimmen. Und wenn dann das Konzept passt, kannst Du immer zu gewissen Stati eine Übergabe/Übernahme vornehmen.

    Du wirst Dich mit Lockingmechanismen beschäftigen müssen.

    LG
    Chris©

    1. Danke für die schnelle Antwort.

      Ein User mach Einstellungen in der App, diese werden in der Session gespeichert. Nun klickt er Ausführen und im Hintergrund kopiert der Server ca. für 20min Daten etc... das ganze wird anhand eines Fortschrittslogs angezeigt. Wenn nun in diesem Fall aber die Session von einer anderen Station aus übernommen wird, darf dieser Vorgang nicht unterbrochen werden (wie du erwähnt hast wegen der Daten integrität). Darum muss ich erkennen ob er bereits im gange ist oder nicht.

      Meine Lösung. Ich kenne die SID des eingeloggten benutzers. Wenn ich mich also erneut einlogge, lese ich das SID file kopiere die darin enthaltenen Daten in mein eigenes Sessionfile. So klone ich die Session. Etwas hässlich aber naja geht. Ich nehme nicht an, dass es so eine art frendly hijacking session Funktion gibt?

      1. Danke für die schnelle Antwort.

        Bitte, gerne geschehen.

        Meine Lösung. Ich kenne die SID des eingeloggten benutzers. Wenn ich mich also erneut einlogge, lese ich das SID file kopiere die darin enthaltenen Daten in mein eigenes Sessionfile. So klone ich die Session. Etwas hässlich aber naja geht. Ich nehme nicht an, dass es so eine art frendly hijacking session Funktion gibt?

        Ich hatte versucht, Dir klarzumachen, dass die Session an den Client gebunden ist und bei geteiltem Arbeiten die gemeinsamen (Kontroll-)Daten ÜBERHAUPT NICHTS ind der Session eines Clients verloren haben, bestenfalls als "private Kopie" (aber das ist auch schon kritisch). Gemeinsame Daten gehören auch in eine gemeinsame Datenhaltung, das ist dann egal, ob es gemeinsam genutzer Hauptspeicher oder Files oder eine DB ist. Dieser gemeinsame Bereich muss mit Semaphoren oder ähnlichen Verfahren auf die konkurrierdende Nutzung vorbereitet sein udn JEDER PROZESS hat diese Flags gefälligst abzufragen und zu bedienen.

        PHP bietet bezüglich Files eine einfache aber effektive Funktionsgruppe]
        http://de2.php.net/manual/en/function.flock.php

        Für die gemeinsame Nutzung von Hauptspeicher gibt es auch Funktionen
        http://de2.php.net/manual/en/ref.sem.php
        http://de2.php.net/manual/en/ref.shmop.php

        LG
        Chris©

        1. Wie es halt so geht mit Webapps. Zuerst macht man mal etwas, dann kommen weitere Anforderungen hinzu, danach baut man aus. Bis die App unübersehbar und extern aufgeblasen ist. Ein riesen gebastel. Hier sitze ich nun und muss das gepfusche eines anderen verbessern.

          Zentrale Daten, Semaphoren etc... klingt vernünftig. Werde etwas in diese Richtung versuchen. Hoffe es dauert nicht länger als die ganze App mit vernünftiger Architektur von grundauf neu zu machen :/

          Danke für die Hilfe
          Ahoi Matze

      2. Moin!

        Ein User mach Einstellungen in der App, diese werden in der Session gespeichert. Nun klickt er Ausführen und im Hintergrund kopiert der Server ca. für 20min Daten etc... das ganze wird anhand eines Fortschrittslogs angezeigt. Wenn nun in diesem Fall aber die Session von einer anderen Station aus übernommen wird, darf dieser Vorgang nicht unterbrochen werden (wie du erwähnt hast wegen der Daten integrität). Darum muss ich erkennen ob er bereits im gange ist oder nicht.

        Meine Lösung. Ich kenne die SID des eingeloggten benutzers. Wenn ich mich also erneut einlogge, lese ich das SID file kopiere die darin enthaltenen Daten in mein eigenes Sessionfile. So klone ich die Session. Etwas hässlich aber naja geht. Ich nehme nicht an, dass es so eine art frendly hijacking session Funktion gibt?

        Das Problem ist, dass du irgendein noch nicht näher definiertes Problem zu lösen hast, und die einzige dir eingefallene Lösung ist die mit Sessions. Daraus resultiert jetzt das Problem, diese vorgefertigte Lösung soweit auszubauen, dass all die Nebenbedingungen (nur ein Client einloggbar, Session auf anderen Browser mitnehmbar) drangestrickt werden müssen, obgleich das nicht das natürliche Verhalten einer Session ist.

        Du solltest noch mal einen Schritt zurückgehen und deine Lösungsidee "Session" hinterfragen. Dazu solltest du vielleicht nochmal ausführlicher beschreiben, was das System denn tatsächlich so tun soll. Denn es scheint mir, dass du Dinge mischst, die besser nicht gemischt werden sollten.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
    • Bei Beginn der "Sitzung": falls ein Paßwort vorhanden ist -> abfragen, sonst Paßwort generieren, speichern und dem user ausgeben.
    • Bei Beginn der Datenverarbeitung ein Flag setzen und am Ende wieder löschen. Solange die Flag gesetzt ist, wird kein Zugriff gestattet.
    • Wenn die Datenverarbeitung abgeschlossen ist und der Nutzer sich das Ergebnis dank Paßwort abgeholt hat, wird die "Sitzung" beendet indem das Paßwort gelöscht wird.
    • Nun darf der Nächste.

    Dafür braucht man keine Session.

  2. Hi,

    Am genialseten wäre, wenn ich den Apache oder die PHP conf so konfigurieren könnte, dass es die Session immer mit dem selben Namen generiert. Ist das möglich?

    session_id() nimmt auch einen Parameter, wenn du ihr einen geben magst.

    MfG ChrisB