2014-09-06 18 views
5

Ho un sapone per autenticare gli utentiPHP Symfony2 autenticazione personalizzato senza database (SOAP)

<?php 
$client = new SoapClient('http://mysite/code/soap.wsdl'); 
$user = $client->login('username','password'); 

if(isset($user['IdAccount']) && ($user['IdAccount'] > 0)) 
    echo 'Logon OK'; 
else 
    echo 'Logon Fail!'; 

Vorrei utilizzare in Symfony2 senza database, solo nella memoria ...

ho cercato di attuare un Custom UserProvider, ma non ho tutti i dati necessari per farlo funzionare ...

class WebserviceUserProvider implements UserProviderInterface 
{ 
    public function loadUserByUsername($username) 
    { 
     $client = new SoapClient('http://mysite/code/soap.wsdl'); 

     $user = $client->login($username, PASSWORD????); 

     if (isset($user['IdAccount']) && ($user['IdAccount'] > 0)) 
      return new WebserviceUser($username, PASSWORD????, SALT???, ROLES????); 

     throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username) 
    ); 
} 

non posso cambiare il sapone

scusa per il mio cattivo inglese! :(

+2

Per farlo nel modo giusto, è necessario possedere un provider di autenticazione personalizzato. Http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html. Non è cosa facile da implementare. lezione all'indietro ha funzionato meglio. Ma suggerirei vivamente di cercare un pacchetto di autenticazione SOAP. Sono sicuro che ce ne sono un paio di buoni. – Cerad

risposta

2

quanto ho capito, si desidera utilizzare l'autenticazione modulo e verificare la password utilizzando il servizio SOAP

Se si usa Symfony 2.4 o superiore, è possibile utilizzare SimpleFormAuthenticatorInterface

implementazione Esempio:.

// ... namespace and uses 

class Authenticator implements SimpleFormAuthenticatorInterface 
{ 
    private $soapClient; 

    public function __construct(\SoapClient $soapClient) 
    { 
     $this->soapClient = $soapClient; 
    } 

    public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) 
    { 
     $user = $this->soapClient->login($token->getUsername(), $token->getCredentials()); 
     if (isset($user['IdAccount']) && ($user['IdAccount'] > 0)) { 
      $user = $userProvider->loadUserByUsername($token->getUsername()); 
      return new UsernamePasswordToken(
       $user, 
       null, 
       $providerKey, 
       $user->getRoles() 
      ); 
     } 

     throw new AuthenticationException('Invalid username or password'); 
    } 

    public function supportsToken(TokenInterface $token, $providerKey) 
    { 
     return $token instanceof UsernamePasswordToken 
      && $token->getProviderKey() === $providerKey; 
    } 

    public function createToken(Request $request, $username, $password, $providerKey) 
    { 
     return new UsernamePasswordToken($username, $password, $providerKey); 
    } 
} 
+0

Ma non capisco come implementare 'UserProviderInterface' per' $ userProvider-> loadUserByUsername ($ token-> getUsername()) ' –

+1

Puoi semplicemente saltare quella linea e creare l'oggetto utente (dovrebbe implementare' UserInterface') dal SOAP risultato del metodo. O semplicemente crearne uno vuoto (ad esempio 'Symfony \ Component \ Security \ Core \ User \ User') con il solo nome utente impostato. Non c'è bisogno di usare il UserProvider lì. –