codinglabsau/laravel-roles

简单的 Laravel 角色

v2.5.1 2024-03-11 04:22 UTC

This package is auto-updated.

Last update: 2024-09-11 05:32:43 UTC


README

Latest Version on Packagist Test Total Downloads

Laravel v10 的简单、灵活的角色实现。

查看 v2.3 以支持 Laravel 6-9

安装

使用 composer 安装

$ composer require codinglabsau/laravel-roles

发布迁移并迁移

php artisan vendor:publish --tag="roles-migrations"
php artisan migrate

配置

如果您需要覆盖默认的 Role 模型,可以通过发布配置并设置 models.role 选项来实现。

php artisan vendor:publish --tag="roles-config"

使用

添加特质

HasRoles 特质添加到您的用户模型中

use Codinglabs\Roles\HasRoles;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable, HasRoles;
}

创建角色

$role = \Codinglabs\Roles\Role::create(['name' => 'manager']);

获取角色

$managerRole = \Codinglabs\Roles\Role::whereName('manager')->first();

关联角色

底层我们使用 Eloquent 多对多关系。

use Codinglabs\Roles\Role;

// attach multiple roles
$user->roles()->attach([
    Role::whereName('employee')->first()->id,
    Role::whereName('manager')->first()->id,
]);

// detach a single role
$user->roles()->detach(Role::whereName('employee')->first());

// update roles to match array
$user->roles()->sync([
    Role::whereName('employee')->first()->id,
]);

// ensure roles in array are attached without detaching others
$user->roles()->syncWithoutDetaching([
    Role::whereName('employee')->first()->id,
]);

使用中间件保护路由

App\Http\Kernel 中注册中间件

protected $routeMiddleware = [
    // ...
    'role' => \Codinglabs\Roles\CheckRole::class,
];

然后在您的路由中调用中间件,多个角色之间用管道分隔

Route::middleware('role:employee')->...
Route::middleware('role:manager|admin')->...

或者使用网关

class UserController extends Controller
{
    public function destroy()
    {
        $this->authorize('role', 'admin');
    }
}

或者在控制器的构造函数中

class ManagerDashboardController extends Controller
{
    public function __construct()
    {
        $this->middleware('role:manager');
    }
}

如果中间件检查失败,将返回 403 响应。

检查用户角色

在用户模型中调用 hasRole

// check a single role
$user->hasRole('foo');

// check whether any role exists
$user->hasRole(['bar', 'baz']);

// get all roles
$user->roles;

使用 blade 指令有条件地显示内容

@role('admin')
<div>Super secret admin stuff goes here...</div>
@endrole

通过 UI(Inertiajs 示例)共享角色

// AppServiceProvider.php
Inertia::share([
    'auth' => function () {
        return [
            'user' => Auth::user() ? [
                'id' => Auth::user()->id,
                'roles' => Auth::user()->roles->pluck('name'),
            ] : null
        ];
    }
]);
// app.js
Vue.mixin({
  methods: {
    hasRole: function(role) {
      return this.$page.auth.user.roles.includes(role)
    }
  }
})
<!-- SomeComponent.vue -->
<div v-if="hasRole('manager')">I am a manager</div>

从 v1 升级到 v2

请参阅 从 v1 升级到 v2 了解详情和升级说明,以避免升级到 v2 后出现任何问题。

贡献

请参阅 contributing.md 了解详情和待办事项列表。

安全

如果您发现任何安全相关的问题,请在 GitHub 上创建一个问题。

鸣谢

许可

MIT。有关更多信息,请参阅 许可文件

关于 Coding Labs

Coding Labs 是一家位于澳大利亚黄金海岸的 Web 应用程序开发公司。请参阅我们网站上的开源项目 在此