aammui/role-permission

laravel角色权限系统

3.1.3 2024-02-09 20:37 UTC

README

内容

  1. 简介
  2. 安装

简介

角色

角色可以用来定义一组权限。如果一个用户拥有编辑角色,他/她可以编辑、删除、发布文章。我更喜欢在大多数情况下使用角色来允许一组动作。

$user->addRole('admin');
  • 角色是不区分大小写的$user->addRole('admin');$user->addRole('Admin');具有相同的意义。
  • 不需要显式创建角色。$user->addRole('admin');这个函数会在数据库中创建一个新的角色admin,如果该角色尚未创建,然后将其分配给指定的用户。

添加权限到角色

$role->addPermission('read article');
// or 
$role->addPermission(['read article','update article']);

将CRUD权限附加到角色。

$role->addResourcePermission('article');

这将添加创建文章、阅读文章、更新文章、删除文章的权限到指定的角色。

权限

权限可以用来拒绝特定的动作。我假设在大多数情况下,动作都与角色相关联。所以,如果阅读、写入、删除文章动作与编辑角色相关联,那么你可以通过以下方式拒绝编辑器删除文章:

$user->removePermission('delete article');

中间件

使用权限或角色作为中间件来保护资源。使用|在中间件中使用多个角色或权限。如果同时定义了角色和权限中间件,则应传递给中间件以访问资源。在这里,即使他有编辑角色,你也可以拒绝发布文章。

在路由中间件部分添加中间件。App\Http\Kernel.php
    protected $routeMiddleware = [
        'role' => \Aammui\RolePermission\Middleware\Role::class,
    ]
在任意位置使用中间件
Route::group(['middleware' => ['role:system admin|database admin','permission:read article']], function () {
    //
});

上面的意思是用户应该有系统管理员或数据库管理员角色并且没有拒绝阅读文章的权限。

安装

composer require aammui/role-permission
Laravel 兼容性

发布资产并运行迁移

php artisan vendor:publish --provider="Aammui\RolePermission\RolePermissionServiceProvider"
php artisan migrate

使用

在你的用户模型中使用一个HasRole特质。

use Aammui\RolePermission\Traits\HasRole;

class User extends Authenticatable
{
    use Notifiable, HasRole;
}

然后以下API将可用。

  • public function addRole($role): void
    sync将角色,如果用户有管理员角色,然后你只发送编辑器,它将删除管理员角色,然后用户将只拥有编辑器角色。发送所有角色以更新角色。
  • public function getRoles(): array
    它以数组的形式返回角色。
  • public function hasGotRole(array $roles): bool

异常

它抛出以下异常如下。

用例:异常用于用户重定向。

假设我们想将未登录的用户重定向到登录页面,这可以通过在app\Exceptions\Handler.php类中处理异常来完成。此异常的目的是为了支持完全自定义。例如,你可能希望将没有正确角色的用户重定向到登录页面,或者你只想显示403页面。

// App\Exceptions\Handler.php;
use Aammui\RolePermission\Exception\UserNotLoginException;
use Aammui\RolePermission\Exception\RoleDoesNotExistException;

....

public function render($request, Throwable $exception)
{
    if ($exception instanceof UserNotLoginException) {
        return redirect('/login')
            ->with('error', $exception->getMessage());
    }
    
    if ($exception instanceof RoleDoesNotExistException) {
        return redirect('/login')
            ->with('error', $exception->getMessage());
    }

    return parent::render($request, $exception);
}