Laravel 4自定义Auth

时间:2014-02-27 09:52:43

标签: php web-services authentication soap 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

已实施的课程:

 <?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它不是解决方案,但我用谷歌搜索而没有找到其他方式

任何想法?

1 个答案:

答案 0 :(得分:2)

除了$user的私有变量AuthUserProvider无法在当前的http请求中存活之外,您几乎已经完成了。如果你不能通过id&#34;检索从您的Web服务,我想唯一的方法是在会话中存储整个用户 - 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检索,我猜您无法通过记住令牌进行检索,因此您可能无法实现&#34;记住我&#34;功能,除非您将部分用户数据存储在第二个数据库中(此时可用于代替上面的会话)。