laravel 使用自带RBAC权限管理(一)

安装一个全新的laravel框架

composer create-project laravel/laravel permission --prefer-dist

cd permission

composer require spatie/laravel-permission


如果出现

$ composer.phar install

Loading composer repositories with package information

Installing dependencies (including require-dev) from lock file

Nothing to install or update

Generating optimized autoload files

> Illuminate\Foundation\ComposerScripts::postAutoloadDump

You made a reference to a non-existent script @php artisan package:discover

这个报错说明composer版本不够 我用的git打开的命令行所以使用composer.phar

升级composer


我的是1.2

升级命令

$ composer.phar selfupdate


再执行

$ composer.phar install


想要在Laravel中使用Entrust,首先需要通过Composer来安装其依赖包:

composer require zizaco/entrust 5.2.x-dev


安装完成后需要在config/app.php中注册服务提供者到providers数组:

Zizaco\Entrust\EntrustServiceProvider::class,

同时在该配置文件中注册相应门面到aliases数组:

'Entrust' => Zizaco\Entrust\EntrustFacade::class,

如果你想要使用中间件(要求Laravel 5.1或更高版本)还需要添加如下代码到app/Http/Kernel.php的routeMiddleware数组:

'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,

'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,

'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,

2、配置

在配置文件config/auth.php中设置合适的值,Entrust会使用这些配置值来选择相应的用户表和模型类:

'providers' => [

    'users' => [

        'driver' => 'eloquent',

        'model' => App\User::class,

        'table' => 'users',

    ],

],

你还可以发布该扩展包的配置以便后续自定义相关表名以及模型类的命名空间:

安装自动加载

$ composer.phar dump-autoload

php artisan vendor:publish


选择包含entrust 的数字编码 

该命令会在config目录下创建一个entrust.php文件。

接下来我们使用Entrust提供的迁移命令生成迁移文件:

php artisan entrust:migration


我这步报错了 报了这个错

$ php artisan entrust:migration

  ReflectionException  : Method Zizaco\Entrust\MigrationCommand::handle() does

not exist


是因为在MigrationCommand.php这个文件下面找不到handle()这个方法,把文件中的fire方法改成handle()这个方法。

再执行

$ php artisan entrust:migration

会生成一个迁移文件

生成数据表

$ php artisan migrate


报错!

$ php artisan migrate

  Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access

violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: a

lter table `roles` add unique `roles_name_unique`(`name`))


问题根源

MySql支持的utf8编码最大字符长度为3字节,如果遇到4字节的宽字符就会出现插入异常。三个字节UTF-8最大能编码的Unicode字符是0xffff,即Unicode中的基本多文种平面(BMP)。因而包括Emoji表情(Emoji是一种特殊的Unicode编码)在内的非基本多文种平面的Unicode字符都无法使用MySql的utf8字符集存储。

解决问题

升级MySql版本到5.5.3以上。

手动配置迁移命令migrate生成的默认字符串长度,在AppServiceProvider中调用Schema::defaultStringLength方法来实现配置:

public function boot()

{

//

    Schema::defaultStringLength(191);

}


再执行

$ php artisan migrate


会生成四张表


laravel 使用自带RBAC权限管理(一)_第1张图片

CREATE TABLE `permission_role` (

  `permission_id` int(10) unsigned NOT NULL,

  `role_id` int(10) unsigned NOT NULL,

  PRIMARY KEY (`permission_id`,`role_id`),

  KEY `permission_role_role_id_foreign` (`role_id`),

  CONSTRAINT `permission_role_permission_id_foreign` FOREIGN KEY (`permission_id`) REFERENCES `permissions` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

  CONSTRAINT `permission_role_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE `permissions` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,

  `display_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `created_at` timestamp NULL DEFAULT NULL,

  `updated_at` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `permissions_name_unique` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE `role_user` (

  `user_id` int(10) unsigned NOT NULL,

  `role_id` int(10) unsigned NOT NULL,

  PRIMARY KEY (`user_id`,`role_id`),

  KEY `role_user_role_id_foreign` (`role_id`),

  CONSTRAINT `role_user_role_id_foreign` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

  CONSTRAINT `role_user_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


CREATE TABLE `roles` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,

  `display_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `description` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `created_at` timestamp NULL DEFAULT NULL,

  `updated_at` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `roles_name_unique` (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



CREATE TABLE `users` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,

  `email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,

  `password` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,

  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

  `created_at` timestamp NULL DEFAULT NULL,

  `updated_at` timestamp NULL DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `users_email_unique` (`email`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

你可能感兴趣的:(laravel 使用自带RBAC权限管理(一))