使用自定义auth驱动程序存储其他会话数据

时间:2014-03-13 18:28:23

标签: php laravel laravel-4

我为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()

我该如何做到这一点,我相信我能以一种丑陋的方式做到这一点,但必须有最好的做法?

2 个答案:

答案 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()函数是没有意义的。