bogardo/multiauth

Laravel Auth 驱动程序,支持多个 Eloquent 模型

v0.2.0 2015-02-16 00:26 UTC

This package is auto-updated.

Last update: 2024-09-17 08:52:47 UTC


README

Latest Stable Version MIT License Build Status Coverage Status Packagist Downloads Total Packagist Downloads Month

Laravel 身份验证驱动程序,允许您使用多个 Eloquent 模型进行身份验证。

此包默认支持 Laravel 的密码提醒,无需额外配置。

安装

目前仅兼容 Laravel 4.2
Laravel 5 的支持计划中

使用 composer 安装包

$ composer require bogardo\multiauth

添加服务提供者

将以下内容添加到您的 app/config/app.php 文件中的 providers 数组中

'Bogardo\Multiauth\MultiauthServiceProvider',

配置

在您的 app/config/auth.php 文件中更改以下内容。

将您的驱动程序设置为 multiauth

'driver'    => 'multiauth'

添加您的 multiauth 设置

'multiauth' => [
 
    'identifier_key' => 'email',

    'entities' => [
        [
            'type'       => 'user',
            'table'      => 'users',
            'model'      => 'User',
            'identifier' => 'username'
        ],
        [
            'type'       => 'administrator',
            'table'      => 'admins',
            'model'      => 'Admin',
            'identifier' => 'email'
        ]
    ]
]

用法

准备您的模型

在您的模型中必须更改以下两项

  1. 添加 Bogardo\Multiauth\User\UserTrait(如果已存在则替换)
  2. 添加一个公共的 $authtype 属性。属性的值应与 multiauth 配置中定义的 type 键相匹配。

示例

用户模型
use Bogardo\Multiauth\User\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface
{

    use UserTrait, RemindableTrait;

    public $authtype = 'user';
    
}
管理员模型
use Bogardo\Multiauth\User\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class Admin extends Eloquent implements UserInterface, RemindableInterface
{

    use UserTrait, RemindableTrait;

    public $authtype = 'administrator';
    
}

验证

当仅使用一个用户表时,您通常只需检查用户表中唯一的电子邮件/用户名。但是,当您使用多个表时,必须确保您的电子邮件/用户名在所有相关表中都是唯一的。

此包提供了一个方便的验证规则来完成这项任务。

它将检查提供的值(电子邮件/用户名)是否在 multiauth 配置中定义的任何表中存在。它将注意配置中定义的标识符(电子邮件/用户名/自定义)。

当不使用额外参数使用此规则时,它将确保提供的值在任何表中都不存在。您可能会在创建新用户时使用此规则。

multiAuthUnique

当更新现有用户时,您希望检查提供的值是否唯一 了您正在更新的记录外。您可以通过提供两个参数来完成此操作

  • 正在更新的用户的 type
  • 正在更新的用户的 id
multiAuthUnique:user,2

用法

创建新记录

Validator::make(
    ['email' => 'email@example.com'], // data array
    ['email' => 'multiAuthUnique']    // rules array
);

更新具有 id 5 的现有管理员用户

Validator::make(
    ['email' => 'email@example.com'],              // data array
    ['email' => 'multiAuthUnique:administrator,5'] // rules array
);

API

获取 Multiauth 服务

/** @var Bogardo\Multiauth\Service $service */
$service = App::make('multiauth.service');

获取所有注册实体的集合 EntityCollection 继承自 Laravel 的 Collection

$entities = $service->getEntities();

// $entities Output
object(Bogardo\Multiauth\Entity\EntityCollection)
  protected 'items' => 
    array (size=2)
	   0 => 
        object(Bogardo\Multiauth\Entity\Entity)
          public 'type' => string 'user'
          public 'table' => string 'users'
          public 'model' => string 'User'
          public 'identifier' => string 'username'
      1 => 
        object(Bogardo\Multiauth\Entity\Entity)
          public 'type' => string 'administator'
          public 'table' => string 'admins'
          public 'model' => string 'Admin'
          public 'identifier' => string 'email'
      

按类型获取实体

$entity = $service->getEntityByType('user');

// $entity Output
object(Bogardo\Multiauth\Entity\Entity)
  public 'type' => string 'user'
  public 'table' => string 'users'
  public 'model' => string 'User'
  public 'identifier' => string 'username'

过滤示例实现

例如,您可以使用此功能为每种用户类型创建自定义路由过滤器。

/** @var Bogardo\Multiauth\Service $service */
$service = App::make('multiauth.service');
$types = $service->getEntities()->lists('type');

foreach ($types as $type) {
    Route::filter('multiauth.' . $type, function($route, $request) use ($type) {

        if (Auth::guest()) {
            // The user is not logged in.
            return Redirect::to('/');
        }

        if (Auth::user()->authtype !== $type) {
            // The user is logged in, but is not of correct type
            return Redirect::to('/');
        }
    });
}

这将为每个注册的用户类型创建路由过滤器

  • 用户: multiauth.user
  • 管理员: multiauth.administrator

您可以使用这些过滤器来限制对只能由特定用户类型访问的路由的访问。

Route::get('admin', ['before' => 'multiauth.administrator', function() {
    echo 'Admins Only!!';
}]);

常见问题解答

- 我无法使用 loginUsingId 和 onceUsingId 方法登录

loginUsingId()onceUsingId() 方法应传递用户的 type 和 id由点分隔。这不同于默认用法,在默认用法中,您只需传递用户的 ID。

Auth::loginUsingId('administrator.2');

Auth::onceUsingId('user.54')

更改日志

v0.2.0

  • 添加单元测试
  • 将验证器移动到其自己的类中
  • 添加徽章
  • 添加 Coverall

v0.1.0

  • 多身份验证实现
  • 更新文档(格式化)

v0.0.1

  • 仅使用文档的初始设置

待办事项

  • 支持Laravel 5