2014-02-27 113 views
6

首先抱歉我的英語,我會盡力做到最好。Laravel 4自定義認證

我是Laravel的新手,我試圖通過一個SOAP WS實現自定義auth,我聲明實現UserProviderInterface的新類。我成功實現retrieveByCredentials和validateCredentials方法,但因爲我沒有訪問數據庫或全球用戶信息我不能實現retrieveByID方法。有沒有什麼辦法使自定義Auth不基於用戶ID?

我需要:

- Login and validate user throught SOAP WS 
- Store User Info returned by WS. 
- Remember me functionality 
- Secure routes based on logged user and level of access 
- Logout 

實現類:

<?php 
    namespace Spt\Common\Providers; 
    use Illuminate\Auth\UserProviderInterface; 
    use Illuminate\Auth\GenericUser; 
    use Illuminate\Auth\UserInterface; 

    class AuthUserProvider implements UserProviderInterface{ 
     private $user; 

     public function __construct(){ 
      $this->user = null; 
     } 

     public function retrieveByID($identifier){ 
      return $this->user; 
     } 

     public function retrieveByCredentials(array $credentials){ 
      $client = new \SoapClient('webserviceurl'); 
      $res = $client->Validar_Cliente($credentials); 
      $res = $res->Validar_ClienteResult; 

      if($res->infoError->bError === true){ 
       return; 
      } 

      $res->id = $res->id_cliente; 
      $user = new GenericUser((array) $res); 
      return $user; 
     } 

     public function validateCredentials(UserInterface $user, array $credentials){ 
      //Assumed that if WS returned a User is validated 
      return true; 
     } 
    } 

我認爲,重新實現UserProviderInterface它不是解決辦法,但我用Google搜索,並沒有發現其他的方式

任何想法?

回答

2

幾乎已經完成了,除了私有變量$userAuthUserProvider不能保留當前的http請求。如果你不能從你的web服務「通過id檢索」,我想唯一的方法是將整個用戶存儲在會話中 - Laravel本身存儲用戶的id在會話中,以及它只存儲id的事實整個用戶)是需要retrieveByID方法的原因之一。
以下只是爲了澄清,未經測試。

class AuthUserProvider implements UserProviderInterface { 

    public function retrieveByCredentials(array $credentials) { 
     $client = new \SoapClient('webserviceurl'); 
     $res = $client->Validar_Cliente($credentials); 
     $res = $res->Validar_ClienteResult; 
     if($res->infoError->bError === true) { 
      return; 
     } 
     $res->id = $res->id_cliente; 

     Session::put('entireuser', $res); 

     $user = new GenericUser((array) $res); 
     return $user; 
    } 


    public function retrieveByID($identifier) { 

     $res = Session::get('entireuser'); 

     return new GenericUser((array) $res); 
    } 

// ... 

} 

如果無法通過ID從Web服務檢索,我想你也不能檢索由記得令牌,所以它可能無法爲你實現「記住我」功能,除非你將用戶數據的一部分存儲在第二數據庫(此時可用於代替上述會話)。