2014-09-06 15 views
5

Tôi có một xà phòng để xác thực người dùngPHP Symfony2 xác thực tùy chỉnh mà không cần cơ sở dữ liệu (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!'; 

Tôi muốn sử dụng trong Symfony2 mà không cần cơ sở dữ liệu, chỉ trong bộ nhớ ...

tôi cố gắng thực hiện một Custom UserProvider, nhưng tôi không có tất cả các dữ liệu cần thiết để làm cho nó làm việc ...

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

tôi không thể thay đổi xà phòng

xin lỗi vì tiếng anh xấu của tôi! :(

+2

Để làm điều đó đúng cách, bạn cần bạn sở hữu Nhà cung cấp xác thực tùy chỉnh. Http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html Không phải là điều dễ thực hiện. hướng dẫn ngược làm việc tốt nhất. Nhưng tôi khuyên bạn nên tìm kiếm một gói xác thực SOAP. Tôi chắc rằng có một vài người tốt. – Cerad

Trả lời

2

Theo tôi được biết, bạn muốn sử dụng xác thực và hình thức kiểm tra mật khẩu sử dụng dịch vụ SOAP

Nếu bạn sử dụng Symfony 2.4 trở lên, bạn có thể sử dụng SimpleFormAuthenticatorInterface

Ví dụ thực hiện:.

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

Nhưng tôi không hiểu cách thực hiện 'UserProviderInterface' cho' $ userProvider-> loadUserByUsername ($ token-> getUsername()) ' –

+1

Bạn có thể bỏ qua dòng đó và tạo đối tượng người dùng (nên thực hiện' UserInterface') từ SOAP kết quả phương pháp. Hoặc chỉ cần tạo một tập tin trống (ví dụ: 'Symfony \ Component \ Security \ Core \ User \ User') chỉ với tên người dùng. Không cần phải sử dụng UserProvider ở đó. –

Các vấn đề liên quan