whitesunrise/guardian

适用于 Laravel 5.3+

dev-master / 1.0.x-dev 2017-06-21 17:20 UTC

This package is not auto-updated.

Last update: 2024-09-20 20:31:31 UTC


README

这是为 White Sunrise, LLC 的软件和网页开发创建的私有 composer 仓库。

此软件包仍在开发中,不应在生产环境中使用

此软件包允许快速并经过测试的方式设置多认证用户验证和认证系统,包括自定义中间件、守卫、迁移和用于测试的种子器。此软件包仅在 Laravel 5.3 和 5.4 上进行过测试。以下为安装说明和其他信息。

关于 White Sunrise LLC

White Sunrise 自 2008 年以来一直在创建优秀的网站和基于云的软件。我们以创新和前沿的开发而闻名,为我们的客户提供定制解决方案。

了解更多关于我们的信息 这里

安装

此软件包可以作为私有 composer 软件包轻松安装。以下为详细信息和文档。

Laravel 5.4

  1. 在您的 Laravel 项目目录中创建一个名为 packages 的文件夹,并将仓库克隆到该文件夹中
cd <project-root-directory>
mkdir packages && cd packages
git clone git@github.com:whitesunrise/guardian.git
  1. 将克隆的仓库添加到您的项目 composer.json 文件的 autoload 部分中
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/",
        "WhiteSunrise\\Guardian\\": "packages/whitesunri/whitesunri/src/"
    }
},
  1. 清除项目根目录中的 composer 和 artisan 自动加载
composer dumpautoload && php artisan clear-compiled
  1. 打开您的 config/app.php 并将以下内容添加到 providers 数组中
WhiteSunrise\Guardian\GuardianServiceProvider::class,
  1. 在相同的 config/app.php 文件中,将以下内容添加到 aliases 数组中
'Guardian' =>  WhiteSunrise\Guardian\Facades\GuardianFacade::class,
  1. 将软件包配置文件发布到 config/guardian.php
php artisan vendor:publish --provider="WhiteSunrise\Guardian\GuardianServiceProvider" --tag=config
  1. 打开您的 config/auth.php 并对 Admin User 类进行以下 3 项更改

    1. providers 数组中

      'providers' => [
          'users' => [
              'driver' => 'eloquent',
              'model' => App\Models\User::class,
          ],
          'admins' => [
              'driver' => 'eloquent',
              'model' => App\Models\AdminUser::class,
          ],
      ],
    2. guards 数组中

      'guards' => [
          'web' => [
              'driver' => 'session',
              'provider' => 'users',
          ],
          'web_admin' => [
              'driver' => 'session',
              'provider' => 'admins',
          ],
      
          'api' => [
              'driver' => 'token',
              'provider' => 'users',
          ],
      ],
    3. passwords 数组中

      'passwords' => [
          'users' => [
              'provider' => 'users',
              'table' => 'password_resets',
              'expire' => 60,
          ],
          'admins' => [
              'provider' => 'admins',
              'table' => 'admin_password_resets',
              'expire' => 60,
          ],
      ],
  2. 如果您想使用中间件(需要 Laravel 5.1 或更高版本,您还需要将以下内容添加到 app/Http/Kernel.php 中的 routeMiddleware 数组中)

'role' => \WhiteSunrise\Guardian\Middleware\GuardianRole::class,
'permission' => \WhiteSunrise\Guardian\Middleware\GuardianPermission::class,
'ability' => \WhiteSunrise\Guardian\Middleware\GuardianAbility::class,

配置

config/auth.php 中设置正确的值。

要进一步自定义表名和模型命名空间,请编辑 config/guardian.php 配置文件。

用户

Guardian 使用 app/Models 目录来存储模型。如果您使用 [Laravel 的认证快速入门](https://laravel.net.cn/docs/5.4/authentication#authentication-quickstart) 生成您的用户模型和控制台,请确保您更新了配置文件中的值。

  1. 生成 Guardian 迁移
php artisan whitesunrise:guardian:make:migration all

这将生成 <timestamp>_guardian_create_roles_tables.php<timestamp>_guardian_create_permissions_tables.php 迁移。现在您可以运行迁移。

php artisan migrate

迁移后,将出现五个新表

  1. roles - 存储角色记录
  2. permissions - 存储权限记录
  3. role_users - 存储角色与用户之间的多对多关系
  4. role_admin_users - 存储角色与管理员用户之间的多对多关系
  5. permission_roles - 存储角色与权限之间的多对多关系

模型

角色

通过运行以下命令在 app/models/Role.php 内生成新的 Role 模型

artisan whitesunrise:guardian:make:model role

Role 模型用于 User 和 AdminUser 模型。两者都有枢纽表以保持用户数据独立。Role 模型有四个主要属性

  • name - 角色的唯一可读名称。例如:“用户管理员”、“项目所有者”、“Widget Co. 员工”。
  • slug - 角色的唯一名称,用于在应用层中查找角色信息。例如:“admin”、“owner”、“employee”。
  • description - 角色详细功能的说明。此字段为可选。
  • parent_id - 可选字段,用于从另一个角色继承权限。

Both parent_id and description are optional; their fields are nullable in the database.

或者,您可以通过扩展以下GuardianRole类来使用现有的角色模型。

namespace App\Models;

use WhiteSunrise\Guardian\Models\GuardianRole;

class Role extends GuardianRole
{
}

权限

app/models/Permission.php 中生成新的 Permission 模型,执行以下命令:

artisan whitesunrise:guardian:make:model permission

Permission 模型有三个主要属性

  • name - 权限的唯一可读名称。例如:“创建帖子”、“编辑用户”、“发布付款”、“订阅邮件列表”。
  • slug - 权限的唯一名称,用于在应用层中查找权限信息。例如:“create-post”、“edit-user”、“post-payment”、“mailing-list-subscribe”。
  • description - 权限的更详细说明。

一般来说,将最后两个属性以句子形式考虑可能会有所帮助:“权限 name 允许用户 description。”

或者,您可以通过扩展以下GuardianPermission类来使用现有的权限模型。

<?php

namespace App\Models;

use WhiteSunrise\Guardian\Models\GuardianPermission;

class Permission extends GuardianPermission
{
}

用户

接下来,在现有的 User 模型中使用 GuardianUserTrait 特性。例如:

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Auth;
use WhiteSunrise\Guardian\Traits\GuardianUserTrait;

class User extends Authenticatable
{
    use Notifiable;
    use GuardianUserTrait;

    // continued...
}

这将启用与 Role 的关系,并为 User 模型添加以下方法

  1. roles()
  2. hasRole($roleSlug, $requireAll = false) - 接受字符串或角色数组进行检查
  3. can($permissionSlug, $requireAll = false) - 接受字符串或权限数组进行检查
  4. ability($roles, $permissions, $options) - 更高级的角色和权限检查
  5. attachRoles($role)
  6. detachRoles($role)
  7. withoutRoles($roles) 静态方法,返回没有指定角色的用户
  8. withRoles($roles) 静态方法,返回具有指定角色的用户

管理员用户

接下来,在现有的 AdminUser 模型中使用 GuardianAdminUserTrait 特性。例如:

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Auth;
use WhiteSunrise\Guardian\Traits\GuardianAdminUserTrait;

class AdminUser extends Authenticatable
{
    use Notifiable;
    use GuardianAdminUserTrait;

    // continued...
}

这将启用与 Role 的关系,并为 User 模型添加以下方法

  1. roles()
  2. hasRole($roleSlug, $requireAll = false) - 接受字符串或角色数组进行检查
  3. can($permissionSlug, $requireAll = false) - 接受字符串或权限数组进行检查
  4. ability($roles, $permissions, $options) - 更高级的角色和权限检查
  5. attachRoles($role)
  6. detachRoles($role)
  7. withoutRoles($roles) 静态方法,返回没有指定角色的用户
  8. withRoles($roles) 静态方法,返回具有指定角色的用户

别忘了转储 composer 自动加载

composer dump-autoload

种子文件

  1. 生成种子文件: artisan whitesunrise:guardian:make:seeder

  2. 将种子文件添加到您的 DatabaseSeeder 类中

    $this->call(GuardianRolesTableSeeder::class);
  1. 生成种子文件: artisan whitesunrise:guardian:make:seeder

  2. 在您的 DatabaseSeeder 类中添加以下内容:$this->call(GuardianRolesTableSeeder::class); 或运行 artisan db:seed --class=GuardianRolesTableSeeder

  3. 在您的 DatabaseSeeder 类中添加以下内容:$this->call(GuardianPermissionsTableSeeder::class); 或运行 artisan db:seed --class=GuardianPermissionsTableSeeder

使用方法

概念

您可以使用 artisan 命令生成以下模型中的任何一个:UserAdminUserRolePermission

  • 生成所有模型: artisan whitesunrise:guardian:make:model all
  • 生成特定模型: artisan whitesunrise:guardian:make:model <user|admin_user|role|permission>
  1. 生成种子文件: artisan whitesunrise:guardian:make:seeder

  2. 在您的 DatabaseSeeder 类中添加以下内容:$this->call(GuardianRolesTableSeeder::class); 或运行 artisan db:seed --class=GuardianRolesTableSeeder

  3. 在您的 DatabaseSeeder 类中添加以下内容:$this->call(GuardianPermissionsTableSeeder::class); 或运行 artisan db:seed --class=GuardianPermissionsTableSeeder

  4. (可选) 在 config/app.php 的别名中添加 Facade

    'Guardian' => WhiteSunrise\Guardian\Facades\GuardianFacade::class,
  5. (可选) 生成模型: artisan whitesunrise:guardian:make:model

  6. 在您的 User 模型中使用 GuardianUserTrait

    <?php
    
    use WhiteSunrise\Guardian\Traits\GuardianUserTrait;
    
    class User extends Eloquent
    {
        use GuardianUserTrait; // add this trait to your user model
    
        ...
    }