codinglabsau / laravel-roles
简单的 Laravel 角色
v2.5.1
2024-03-11 04:22 UTC
Requires
- php: ^8.1
- illuminate/support: ^10.0|^11.0
Requires (Dev)
- codinglabsau/php-styles: dev-main
- orchestra/testbench: ^8.0
- phpunit/phpunit: ^10.0
README
Laravel v10 的简单、灵活的角色实现。
安装
使用 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 应用程序开发公司。请参阅我们网站上的开源项目 在此。