Laravel 4自定义Auth

jmo*_*eno 6 php authentication soap web-services laravel-4

首先抱歉我的英语,我会尽力做到最好.

我是Laravel的新手,我试图通过SOAP WS实现自定义身份验证,我声明了实现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
Run Code Online (Sandbox Code Playgroud)

实施类:

 <?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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为重新实现UserProviderInterface它不是解决方案,但我用谷歌搜索,而不是找到其他方式

任何的想法?

mat*_*pop 2

除了私有变量不能在当前的 http 请求中生存之外,您几乎已经完成$userAuthUserProvider。如果您无法从 Web 服务中“按 id 检索”,我想唯一的方法是将整个用户存储在会话中 - Laravel 本身将用户的 id 存储在会话中,并且它仅存储 id(而不是整个 id) user)是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);
    }

//  ...

}
Run Code Online (Sandbox Code Playgroud)

如果您无法通过网络服务中的 id 进行检索,我想您也无法通过记住令牌进行检索,因此您可能无法实现“记住我”功能,除非您将部分用户数据存储在第二个数据库中(此时可以使用它来代替上面的会话)。