LC02 第 3 遍学习小结 -- 操作记录 7

由于LC02教程和实际需要开发的项目之间存在差异,所以第3遍学习只关注自己实际项目必须会用到的技能点。

第八章. 角色权限和管理后台

8.1. 多角色用户权限

8.1.1 权限管理扩展包

https://github.com/spatie/laravel-permission

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 控制面板设置访问权限;
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

将托管在 packagist.org 和 github.com 的扩展包使用国内 CDN 加速
GitHub Laravel 扩展包 TOP 250
速查表方便快速查询框架功能,支持手机访问,支持中英文版本
Laravel 中文文档,由社区用户翻译和维护,将会保持一直更新
此文档的目的,就是为了提高技术团队的凝聚力、一致性和生产效率。
开发环境的部署,开发者工具的选择,适用于 Mac 和 Windows。
浓缩过后的精华
Laravel Nova 后台管理面板文档的中文翻译
Lumen 中文文档,由社区用户翻译和维护,将会保持一直更新
Laravel 下知名扩展包 Dingo API 的中文文档,Laravel API 开发必知必会