PHP und SOAP

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP und SOAP

    Hallo,

    erst einmal kurz eine Beschreibung des Problems:
    Ich habe eine PHP-Klasse, die einen SOAP-Server darstellen soll und für die Verwaltung von Daten einer Datenbank zuständig ist. Um Daten z.B. zu editieren muss man vorher ein login durchführen.
    Vereinfachte Darstellung Server:
    PHP-Code:
    <?php
        
    class server
        
    {
            private 
    $b_login_ok FALSE;
            
            public function 
    login($username$password)
            {
                if( 
    abfrage_der_datenbank==TRUE )
                    
    $this->b_login_ok TRUE;
            }
            
            public function 
    update($input)
            {
                if(
    $this->b_login_ok == TRUE)
                    
    //erledige das Datenbank-Update
            
    }
        }
    ?>
    Vereinfachte Darstellung Client:
    PHP-Code:
    <?php
        $client 
    = new SoapClient("http://irgendwas/server.php?wsdl");
        
    $client->login'mein_benutzername''mein_passwort' );
        
    $client->update'irgendwelche geänderten datenbank daten?!' );
    ?>
    Wenn ich das so realisiere, vergisst der server zwischen dem login und dem update nämlich, dass die Variable b_login auf true gesetzt wurde.
    Geht das so, oder muss bei JEDEM Funktionsaufruf Logindaten mitgesendet werden?
    Dank schon mal.

    Gruß,
    Markus

  • #2
    die verbindug wird nach dem aufruf von der erster Methode getrennt und bei dem Aufruf von der 2-ter Methode wird dein server-script neu gestartet . also ist deine $b_login_ok wieder auf false gesetzt.
    vielleicht hilft dir das weiter:
    http://de2.php.net/manual/de/function.soap-soapserver-setpersistence.php
    Slava
    bituniverse.com

    Kommentar


    • #3
      Vielen Dank für die kompetente Antwort. Hab zwar lange gesucht, aber die Erklärung habe ich leider dazu nicht gelesen gehabt. Oder mein Englisch ist dafür nicht gut genug...
      Leider ist das meiner Meinung nach nicht wirklich Vorteilhaft für SOAP. D.h. also, ich müsste dann entweder jedesmal eine Art Schlüssel, also bei jedem Funktionsaufruf mitsenden, oder mit Funtionen wie __wakeup und __sleep (wenn ich mich nicht irre) arbeiten, um nicht serialisierbare Funktionen wie die PDO-Schnittstelle verwenden zu können!?

      Kommentar


      • #4
        versuch bitte nach der 'class server' das zu machen
        PHP-Code:
        $service=new SoapServer("http://irgendwas/server.php?wsdl");
        $service->setClass("server");
        $service->setPersistence(SOAP_PERSISTENCE_SESSION); 
        und teste dein Client-script noch ein mal
        Slava
        bituniverse.com

        Kommentar


        • #5
          So funktioniert das und es werden keine Werte mehr "vergessen". Danke schön.
          Allerdings kann ich dann in der jetzigen Form keine Datenbankverbindung mit PDO aufbauen, da PDO nicht serialisiert werden kann.

          Kommentar


          • #6
            natürlich kann PDO nicht serialisiert werden, da diese Klassen mit Resourcen arbeiten.
            Slava
            bituniverse.com

            Kommentar


            • #7
              Wenn man drüber nachdenkt ist das ja auch völlig logisch, aber erst dann
              Ich habe das jetzt mittlerweile durch __sleep und __wakup geregelt und es läuft zu meiner zufriedenheit.
              Eine Frage habe ich aber noch:
              Wenn ich in der Server-Klasse sensible Daten (Passwörter) speichern würde, kann der Client dann durch auslesen von Session-Variablen oder ähnlichem auf diese Daten zugreifen?

              Gruß,
              Markus

              Kommentar


              • #8
                Original geschrieben von MS4747

                Wenn ich in der Server-Klasse sensible Daten (Passwörter) speichern würde, kann der Client dann durch auslesen von Session-Variablen oder ähnlichem auf diese Daten zugreifen?
                Antwort mit Gegenfrage:
                Kann ein Browser auf die session-daten zugreifen?
                Slava
                bituniverse.com

                Kommentar


                • #9
                  Original geschrieben von Slava
                  Antwort mit Gegenfrage:
                  Kann ein Browser auf die session-daten zugreifen?
                  Wenn ich das jetzt so genau wüsste ...
                  Eigentlich müsste ich doch nur auf der Client-Seite nach dem login ein print_r($_SESSION) ausführen, um zu sehen, ob dort sensible Daten gespeichert wurden. Aber zu sehen ist da nichts. Allerdings mit nem print_r($_SESSION) auf der Server-Seite auch nicht.

                  Kommentar


                  • #10
                    so lange du in deinem serverseitigem script keine session-daten dem client zeigst, sieht der klient sie auch nicht, da die inhalte von $_SESSION auf dem server gespeichert sind.
                    einzige bindung zwischen dem client und server ist session_id, die client für die identifitierung an den server sendet und server an hand von session_id die local-gespeicherte daten in $_SESSION ladet.
                    Was übernimmt eigentlich session?
                    1)guken, ob der client schon eine session-id hat
                    2)wenn keine session_id da ist, dann eine session_id generieren und bei dem user speichern (das muss eine zufällige und lange zeichenkette sein, damit die andere clients oder haker mit einer sehr geringer Warscheinlichkeit rausfinden könnten) .
                    Wenn session_id vorhanden ist, dann die passende daten finden(an hand von session_id) und die globale variable $_SESSION mit diesen Daten belegen.
                    3) bei Setzen von einem neuem wert in $_SESSION, diesen wert persitent zu machen, also in eine Datei oder DB oder wie auch immer, so abspeichern, dass man später an hand von session_id an diese Daten wieder kommt.

                    Es ist nicht so, dass man die oben genannte 3 Punkte schwär zu erledigen sind, aber warum muss man das machen, wenn das alles Session übernimmt?

                    wenn du noch mal die docu zum SoapServer::setPersistence liest, dann wirst du entdechen, dass alle private variablen die Du in deinem Server-classe benutzt in session gespeichert werden.
                    Slava
                    bituniverse.com

                    Kommentar


                    • #11
                      Dann möchte ich dir jetzt noch eben zu deiner umfangreichen Hilfe und Bemühungen danken. Ich habe wie ich sehe noch viel zu lernen...

                      Kommentar


                      • #12
                        Original geschrieben von MS4747
                        Ich habe wie ich sehe noch viel zu lernen...
                        Ich auch
                        Slava
                        bituniverse.com

                        Kommentar

                        Lädt...
                        X