首先抱歉我的英语,我会努力做到最好。
我是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
它不是解决方案,但我用谷歌搜索而没有找到其他方式
任何想法?
答案 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;功能,除非您将部分用户数据存储在第二个数据库中(此时可用于代替上面的会话)。