2014-09-06 28 views
5

我有肥皂来验证用户身份没有数据库(SOAP)PHP Symfony2的自定义验证

<?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!'; 

我想在Symfony2中使用无需数据库,只在内存...

我试图执行一个Custom UserProvider,但我没有使它工作所需的所有数据...

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) 
    ); 
} 

我不能改变肥皂

抱歉我的英文不好! :(

+2

要做到这一点正确的方式,你需要你自己的自定义身份验证提供程序。http://symfony.com/doc/currentbook/security/custom_authentication_provider.html。不容易的事情来实现。教程后退效果最好。但我强烈建议寻找一个SOAP认证包。我确定有一些好的。 – Cerad 2014-09-06 20:15:36

回答

2

据我了解,要使用形式的认证,并使用SOAP服务检查密码

如果您使用的Symfony 2.4以上,就可以使用SimpleFormAuthenticatorInterface

实现示例:

// ... 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

但我不明白如何为'$ userProvider-> loadUserByUsername($ token-> getUsername())' – 2014-10-04 08:07:49

+1

实现'UserProviderInterface'您可以跳过该行并从SOAP创建用户对象(应该实现'UserInterface')方法结果。或者只用用户名设置创建空的(例如'Symfony \ Component \ Security \ Core \ User \ User')。不需要在那里使用UserProvider。 – 2014-10-08 21:02:53