目录
一、安装laravel-permissions扩展
二、生成数据库迁移文件
三、执行数据迁移
四、php artisan migrate 生成的表
五、生成配置信息
六、在user模型下加载角色相关信息
七、测试角色、权限
一、安装laravel-permissions扩展
#不指定安装版本的命令
composer require spatie/laravel-permission
#指定安装版本的命令
composer require "spatie/laravel-permission:~2.7"
说明:~2.7是安装的版本,因为需要根据框架的版本选择permission扩展的版本(根据个人框架版本来选择。我安装的是2.7版本)
二、生成数据库迁移文件
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
执行完生成迁移文件命令,就会在 \database\migrations 目录下,生成一个以_create_permission_tables.php 结尾的文件。
三、执行数据迁移
php artisan migrate
如果MySQL版本低,执行完命令就会报错,错误如下
意思就是:MySQL版本低,列的字段长度太长。
解决方法:修改app里的providers里的AppServiceProvider.php文件
\Schema::defaultStringLength(191);
再次执行:php artisan migrate 命令即可
四、php artisan migrate 生成的表
- 首先是用户表(users)都是一些基本用户信息包括名字、邮箱、密码什么的。
- 权限表(permissions)权限表就是存放所有权限的一张表,权限可以是控制器访问权限,接口访问权限,model访问权限。
- 角色表(roles)角色表就是存放你所有的角色。
- 用户权限表(model_has_permissions)这张表记录的就是model_id,permission_id的多对多的关系表,用户直接获取权限。
- 用户角色表(model_has_roles)这张表记录的用户拥有的角色,表里有model_id,role_id这个也是记录用户和角色多对多的关系表。
- 角色权限表(role_has_permissions)这张表记录的是角色拥有哪些权限,表里就2个字段role_id,permission_id,也可以根据需要进行拓展!
五、生成配置信息
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
会在 config 目录下生成一个:permission.php文件
六、在user模型下加载角色相关信息
use HasRoles;
七、测试角色、权限
#新建一个控制器
php artisan make:controller IndexController
控制器的内容如下:
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use phpDocumentor\Reflection\Types\Self_;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Traits\HasRoles;
class IndexController extends Controller
{
public function index()
{
//@TODO 自己测试的时候,根据步骤从上到下执行每个方法即可
//添加用户、添加角色、添加权限
//self::addUserRolePermission();
//给用户添加角色
//self::userAddRole();
//给角色添加权限
//self::roleAddPermission();
//给用户添加权限
self::userAddPermission();
}
//测试:添加测试用户、添加测试角色、添加测试权限
private static function addUserRolePermission()
{
$userData = [
['name' => '张三', 'mobile' => '13666666666', 'password' => '123',],
['name' => '李四', 'mobile' => '13888888888', 'password' => '123',],
];
//添加用户
$userInfo = User::insert( $userData );
//添加角色
$roleData = [
['name' => '作家',],
['name' => '读者'],
];
foreach($roleData as $roleValue){
$role = Role::create( $roleValue );
}
//添加权限
$permissionData = [
['name' => '新增文章'],
['name' => '编辑文章'],
['name' => '查看文章'],
['name' => '删除文章'],
];
foreach($permissionData as $permissionValue){
$permission = Permission::create( $permissionValue );
}
echo 'ok';
die;
}
//测试:给用户添加角色
private static function userAddRole()
{
//执行完此步骤,表[model_has_roles]会多一条数据,model_type=App\User:就代表是用户 role_id:角色id model_id:用户id
$user = User::find( 1 );
$res = $user->assignRole( '作家' );
print_r( $res );
}
//测试:给角色添加权限
private static function roleAddPermission()
{
/**
* 第一种方式:给角色添加权限 @TODO 每次添加一个权限
* 执行完此步骤,表[role_has_permission]会多一条数据,permission_id:权限id role_id:角色id
* 给作家添加[新增文章权限]
*/
$role = Role::find( 1 );
//$res = $role->givePermissionTo('新增文章');
//print_r($res);die;
/**
* 第二种方式:将权限分给角色 @TODO 每次给角色添加一个权限
* 给作家添加[查看文章]
*/
$permission = Permission::find( 2 );
//$res = $permission->assignRole($role);
//print_r($res);die;
/**
* 第三种方式:将多个权限同步到一个角色
* 给作家添加[查看文章 和 删除文章 权限]
* @TODO syncPermissions 该方法会覆盖掉角色之前所有的权限
*/
$permission = Permission::whereIn( 'id', [1, 2] )->get();
$allPermission = $role->syncPermissions( $permission );
}
//测试:给用户添加权限
private static function userAddPermission()
{
//执行完此步骤,表[model_has_permission]会多一条数据,model_type=App\User:就代表是用户
$user = User::find( 1 );
$addUserPermission = $user->givePermissionTo( '新增文章' );
print_r( $addUserPermission );
}
}