Ergebnis 1 bis 15 von 15

Thema: Call User aus Rest

  1. #1
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard Call User aus Rest

    Hallo,

    mit dem Modul "restful-webservices" versuche ich aktuell, auf die User-Klasse zuzugreifen.
    Leider erhalte ich (egal auf welchen Weg ich es versuche) diese Fehlermeldung:
    HTML-Code:
    15-Dec-2015 21:26:40 GMT] PHP Fatal error:  Cannot instantiate abstract class Contao\User in ...../system/modules/core/library/Contao/User.php on line 151
    Was mache ich falsch?

    Hier mein Code:
    PHP-Code:
    <?php
    namespace myNamespace;

    use \
    Haste\Http\Response\JsonResponse;
    use \
    Contao\User;

    class 
    WebserviceLogin extends \RESTfulWebservices\RESTfulController
    {
        public function 
    get()
        {
            
    $arrData = array();

            
    $user $_GET['user'];
            
    $password $_GET['password'];

            if (!empty(
    $user) && !empty($password)) {
               if (
    User::getInstance()->findBy('username'$user) == false) {
                   
               }
            }

            
    // Add "Hello World!" to the json output
            
    $arrData['user'] = $_GET['user'];

            
    // Send response
            
    $objResponse = new JsonResponse();
            
    $objResponse->setContent($arrDataJSON_PRETTY_PRINT);
            
    $objResponse->send();
        }

        public function 
    put()
        {
            
    // Code for PUT requests
        
    }

        public function 
    post()
        {
            
    // Code for POST requests
        
    }

        public function 
    delete()
        {
            
    // Code for DELETE requests
        
    }
    }

  2. #2
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.514
    User beschenken
    Wunschliste

    Standard

    Falls du auf die Frontend User zugreifen willst, dann
    PHP-Code:
    FrontendUser->getInstance().. 
    ansonsten
    PHP-Code:
    BackendUser->getInstance().. 
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  3. #3
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard

    Ach, das wars!! Danke

    Allerdings bin ich mir noch nicht sicher, ob die Methode auch so funktionieren kann... da ich für einen validen User immer "false" als Rückgabe erhalte.
    Im Grunde möchte ich gerne, das übergebene PW mit dem übergebenen Benutzernamen in Contao prüfen, ob es diesen als Frontenduser gibt.
    Gibts dafür ne Methode oder muss ich diese selber schreiben?

    PHP-Code:
    <?php
    namespace myNamespace;

    use \
    Haste\Http\Response\JsonResponse;
    use \
    Contao\FrontendUser;

    class 
    WebserviceLogin extends \RESTfulWebservices\RESTfulController
    {
        public function 
    get()
        {
            
    $arrData = array();

            
    $user $_GET['user'];
            
    $password $_GET['password'];

            
    $frontendUser FrontendUser::getInstance();

            if (!empty(
    $user) && !empty($password)) {
               if (
    $frontendUser->findBy('username'$user)) {
                      
    $arrData['name'] = $frontendUser->name;
                   
    $arrData['found'] = 'true';
               } else {
                   
    $arrData['found'] = 'false';
               }
            }

            
    // Add "Hello World!" to the json output
            
    $arrData['user'] = $_GET['user'];

            
    // Send response
            
    $objResponse = new JsonResponse();
            
    $objResponse->setContent($arrDataJSON_PRETTY_PRINT);
            
    $objResponse->send();
        }

        public function 
    put()
        {
            
    // Code for PUT requests
        
    }

        public function 
    post()
        {
            
    // Code for POST requests
        
    }

        public function 
    delete()
        {
            
    // Code for DELETE requests
        
    }
    }

  4. #4
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard

    Hmm, niemand ne Idee?

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.179
    Partner-ID
    10107

    Standard

    Dein findBy Aufruf mutet mir etwas seltsam an, macht das Contao im regulären Modul auch so?

  6. #6
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.945

    Standard

    Du holst zwar eine User mit dem Usernamen gemäß $_GET['user'] (besser \Input::get('user')) aber der ist nicht authentifiziert. Das Passwort holst Du auch aus dem Request, machst aber nichts damit.

    Auch Dein $frontendUser = FrontendUser::getInstance(); zusammen mit $frontendUser->findBy('username', $user) erscheint mir etwas komisch:

    FrontendUser::getInstance(); sollte Dir den angemeldeten Frontend User geben -- oder eben einen nicht angemeldeten "leeren" User, falls ein "Gast" die URL aufruft..

    findBy('username', $user) ist eher eine Methode des UserModels um einen Record aus der Datenbank zu finden.

    M.E. fehlt bei allem noch die Anmeldung/Authentifizierung/Autorisierung.

  7. #7
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard

    Okay, ich dachte dass ich mit findBy den User über die DB finde, ob der überhaupt existiert.
    Macht der Core in Contao in der User.php oder Frontenduser.php genauso.
    Daher dachte ich, dass ich den selben Weg gehen kann.

    Mit welchen Methoden kann ich eurer Meinung nach, mit User und PW prüfen, ob es sich um einen validen User handelt, der in der DB existiert?
    Kann ich dazu eine Methode verwenden, die Contao bereitstellt oder muss ich dafür was eigenes schreiben?

    Danke!

  8. #8
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Also FrontendUser::getInstance() ist schonmal gänzlich falsch, da dies nur für das aktuell eingeloggte Mitglied gilt. Und dieser sollte, sofern nicht schon eingeloggt immer false zurückgeben.

    Ich denke das hier ist besser dafür geeignet
    PHP-Code:
    $objMember = \MemberModel::findBy('username',$user); 
    Und das Passwort prüfen kannst du mit

    PHP-Code:

    $password 
    = \Encryption::hash($password);

    if(\
    Encryption::verify($password$objMember->password))
    {
    $arrData['found'] = 'true';
    }
    else
    {
    $arrData['found'] = 'false';


    So oder so ähnlich, aber FrontendUser::getInstance() ist definitiv falsch
    Geändert von the_scrat (17.12.2015 um 09:09 Uhr)
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.179
    Partner-ID
    10107

    Standard

    Zitat Zitat von the_scrat Beitrag anzeigen
    aber FrontendUser::getInstance() ist definitiv falsch
    Hab' gerade nachgesehen, Contao macht es eigentlich doch genau so. Die Klasse \Contao\User (wovon \Contao\FrontendUser ableitet) hat eine public function findBy(…).

  10. #10
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Richtig, da findet aber der komplette Loginvorgang auch im Contao statt. Wofür braucht es denn dann eine REST API wenn der User eh im Contao unterwegs ist bzw. sich dort einloggt, dann brauch ich doch auch keine Prüfung mehr ob es den user gibt oder das passwort stimmt, denn das weiß ich ja, sobald FrontendUser::getInstance() nicht falsch ist.
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.179
    Partner-ID
    10107

    Standard

    \FrontendUser::getInstance() ist ja nie null oder false. Die Funktion erzeugt nur eine Instanz des FrontendUser Objekts - mehr nicht. Ob ein User eingelogged ist oder nicht ist damit noch nicht geklärt.

  12. #12
    Contao-Urgestein Avatar von the_scrat
    Registriert seit
    24.02.2010.
    Ort
    Augsburg
    Beiträge
    2.051
    User beschenken
    Wunschliste

    Standard

    Stimmt, hast recht, über die reine Instanz ist das nicht geklärt.

    Das funktioniert genauso wie das MemberModel (wusste ich bisher garnicht).
    PHP-Code:
    \FrontendUser::getInstance()->findBy('username',$user); 
    Programmers don't comment their code. It was hard to write, it should be hard to understand...

  13. #13
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard

    Habs hinbekommen.
    Danke für die Hinweise und Tipps...

    Hiermit funktioniert es:

    PHP-Code:
    $objMember = \MemberModel::findBy('username'$user); 
                
    $isAuthenticated false;
                
    $isDisabled false;
                
                
    // The password has been generated with crypt()
                
    if (\Encryption::test($objMember->password)) {
                    
    $isAuthenticated = (crypt($password$objMember->password) == $objMember->password);
                } 

  14. #14
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.945

    Standard

    Anregung: vielleicht magst Du Fehlversuche beim Login noch mitzählen und dann genauso wie beim normalen Login das Konto für eine gewisse Zeit sperren. Ansonsten könnte ein Angreifer bei deiner Webservice umbegrenzt Passwörter probieren. Den Code dazu solltest Du fast 1:1 aus system/modules/core/library/Contao/user.php aus der Methode login() abschauen.

  15. #15
    Contao-Nutzer
    Registriert seit
    03.06.2012.
    Beiträge
    61

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Anregung: vielleicht magst Du Fehlversuche beim Login noch mitzählen und dann genauso wie beim normalen Login das Konto für eine gewisse Zeit sperren. Ansonsten könnte ein Angreifer bei deiner Webservice umbegrenzt Passwörter probieren. Den Code dazu solltest Du fast 1:1 aus system/modules/core/library/Contao/user.php aus der Methode login() abschauen.
    Stimmt, das ist ne gute Idee... werd ich noch mit einbauen, danke!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •