我为Laravel应用程序创建了一个自定义Auth驱动程序。现在我想知道在我的auth会话中添加额外数据的标准方法是什么。
我创建了一个自定义守卫:
class MyAppGuard extends Guard {
//...
}
用户提供商:
class MyAppUserProvider implements UserProviderInterface {
//...
}
我在global.php
注册了我的驱动程序:
Auth::extend('mydriver', function($app) {
$provider = new \MyApp\Auth\MyAppUserProvider($app['hash'], 'User');
return new \MyApp\Auth\MyAppGuard($provider, $app['session.store']);
});
一切似乎都运行良好,我可以使用MyAppGuard
调用Auth::myCustomMethod()
的自定义方法,依此类推。
我现在想要将该用户的所有权限添加到会话中,以便可以通过Auth::permissions()
访问这些权限,例如用户超过Auth::user()
。
我该如何做到这一点,我相信我能以一种丑陋的方式做到这一点,但必须有最好的做法?
答案 0 :(得分:1)
在您的提供者类中执行以下操作:
public function permission()
{
// get the id of the authentication users session
$id = $this->session->get($this->getName());
// now do a query to get the users permission by his/her id
$permission = ...
return $permission;
}
称之为
Auth::permission();
如果您查看Laravel Auth的代码。每次调用Auth::user();
时它都会生成一个新的用户模型,除非它是相同的请求,然后它们只是立即返回现有数据。
他们在会话中存储的唯一内容是用户ID。因此,我不建议使用会话来存储您的权限。只需使用会话中的现有用户标识并查询权限,然后返回数据。
从Guard.php
,您可以访问用户标识符,如:
$id = $this->session->get($this->getName());
注意:我不是专家。
添加如下内容:
protected $permission;
然后设置为
$this->permission = $permission;
这与laravel用于Auth::user()
的方法相同。我认为这不会减慢您的申请速度。
然后在permission()
函数中检查$this->permission
是否已设置。
if (!is_null($this->permission))
{
return $this->permission;
}
// then do the rest here like getting the permission
...
这样,如果请求的权限已经存在,那么它将返回它,而不是再次执行整个查询(可能使其变慢的部分)。
答案 1 :(得分:1)
现有的Guard类为您提供了所需的所有工具。
请求模型上的关系缓存关系,登录用户的模型存储在会话数据中。
利用现有的user()函数,该函数检查当前登录的用户或记住我的cookie,然后存储会话数据。
MyAppGuard内部:
public function permissions() {
if ($user = $this->user()) {
return $user->permissions;
} else {
return $user;
}
}
无需将权限加载到用户模型中。由于调用permissions()将关系缓存到登录的用户模型中,因此数据存储在会话中。
您可以通过覆盖setUser()函数
来急切加载权限public function setUser() {
parent::setUser();
$this->user->load('permissions');
}
一旦用户登录,就会将权限存储到会话数据中,而不是在第一次调用permissions()函数时缓存权限。但是,它确实没有任何区别。
作为一个侧边栏,这在技术上都不是必需的。如果您在代码中的任何位置调用Auth :: user() - >权限,则会在当前会话中缓存当前登录用户的凭据。所以Auth :: permissions()函数是没有意义的。