2014-02-27 71 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服务检索,我想你也不能检索由记得令牌,所以它可能无法为你实现“记住我”功能,除非你将用户数据的一部分存储在第二数据库(此时可用于代替上述会话)。