LC02 第 3 遍学习小结 -- 操作记录 7
由于LC02教程和实际需要开发的项目之间存在差异,所以第3遍学习只关注自己实际项目必须会用到的技能点。
第八章. 角色权限和管理后台
8.1. 多角色用户权限
8.1.1 权限管理扩展包
https://github.com/spatie/laravel-permissi...
1) 安装扩展包
$ composer require "spatie/laravel-permission:~2.29"
生成数据库迁移文件:
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
$ php artisan migrate
生成配置信息:
$ php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
配置信息存放于 config/permission.php ,可以打开此文件瞧一瞧,目前我们不需要做任何修改。
2) 加载 HasRoles Trait
此举能让我们获取到扩展包提供的所有权限和角色的操作方法。
app/Models/User.php
use HasRoles;
3) 初始化角色和权限
$ php artisan make:migration seed_roles_and_permissions_data
打开迁移文件,书写初始化权限和角色的代码:
database/migrations/{timestamp}_seed_roles_and_permissions_data.php
将所有的初始化权限和角色写到这里!!!
为了测试的方便,我们需要在生成用户填充数据以后,为 1 号和 2 号用户分别指派角色,修改 run() 方法 :database/seeds/UsersTableSeeder.php
public function run()
{
.
.
.
// 初始化用户角色,将 1 号用户指派为『站长』
$user->assignRole('Founder');
// 将 2 号用户指派为『管理员』
$user = User::find(2);
$user->assignRole('Maintainer');
}
$ php artisan migrate:refresh --seed
4) laravel-permission 的一些简单用法。
新建角色,只需要提供 name 字段即可:
use Spatie\Permission\Models\Role;
$role = Role::create(['name' => 'Founder']);
为角色添加权限:
use Spatie\Permission\Models\Permission;
Permission::create(['name' => 'manage_contents']);
$role->givePermissionTo('manage_contents');
赋予用户某个角色:
// 单个角色
$user->assignRole('Founder');
// 多个角色
$user->assignRole('writer', 'admin');
// 数组形式的多个角色
$user->assignRole(['writer', 'admin']);
我们可以使用以下方法来检查用户角色:
// 是否是站长
$user->hasRole('Founder');
// 是否拥有至少一个角色
$user->hasAnyRole(Role::all());
// 是否拥有所有角色
$user->hasAllRoles(Role::all());
检查权限:
// 检查用户是否有某个权限
$user->can('manage_contents');
// 检查角色是否拥有某个权限
$role->hasPermissionTo('manage_contents');
直接给用户添加权限:
// 为用户添加『直接权限』
$user->givePermissionTo('manage_contents');
// 获取所有直接权限
$user->getDirectPermissions()
8.2. 站点权限部署
8.2.1 内容管理权限
vi app/Policies/Policy.php
<?php
namespace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
class Policy
{
use HandlesAuthorization;
public function before($user, $ability)
{
// 如果用户拥有管理内容的权限的话,即授权通过
if ($user->can('manage_contents')) {
return true;
}
}
}
代码生成器所生成的授权策略,都会统一继承 App\Policies\Policy 基类,这样我们只需要在基类的 before() 方法里做下角色权限判断即可作用到所有的授权类:
8.2.2 用户切换工具 sudo-su
1) 安装
$ composer require "viacreative/sudo-su:~1.1"
2) 添加 Provider
app/Providers/AppServiceProvider.php
public function register()
{
if (app()->isLocal()) {
$this->app->register(\VIACreative\SudoSu\ServiceProvider::class);
}
}
3) 发布资源文件
$ php artisan vendor:publish --provider="VIACreative\SudoSu\ServiceProvider"
4) 修改配置文件
vi config/sudosu.php
return [
// 允许使用的顶级域名
'allowed_tlds' => ['dev', 'local', 'test'],
// 用户模型
'user_model' => App\Models\User::class
];
5) 模板植入
resources/views/layouts/app.blade.php
.
.
.
@if (app()->isLocal())
@include('sudosu::user-selector')
@endif
<!-- Scripts -->
.
.
.
8.2.3 Horizon 访问权限
vi app/Providers/AuthServiceProvider.php
<?php
.
.
.
class AuthServiceProvider extends ServiceProvider
{
.
.
.
public function boot()
{
$this->registerPolicies();
\Horizon::auth(function ($request) {
// 是否是站长
return \Auth::user()->hasRole('Founder');
});
}
}
8.3-8.8 管理后台
教程中使用的是Laravel Administrator,不是很合适,全部pass
8.9
- 使用 laravel-permission 构建一套多用户权限管理系统;
- App\Policies\Policy 基类 来全局授权用户;
- 使用 sudo-su 用户切换工具;
- 为 Horizon 控制面板设置访问权限;