《laravel的权限-laravel 权限》
解决方案简述
在Laravel项目中,实现权限管理是保障系统安全、有序运行的重要环节。一个有效的解决方案是通过使用第三方包如spatie/laravel - permission来快速搭建权限体系,它能方便地创建角色和权限,并且与Laravel的认证系统很好地集成。
基于spatie/laravel - permission实现权限控制
安装
在终端执行以下命令安装该包:
composer require spatie/laravel-permission
然后发布配置文件:
php
php artisan vendor:publish --provider="SpatiePermissionPermissionServiceProvider"
接下来迁移数据库:
php
php artisan migrate
创建角色和权限
可以在Tinker(Laravel自带的交互式命令行工具)中或者控制器里创建。例如在控制器里:
```php
use SpatiePermissionModelsRole;
use SpatiePermissionModelsPermission;
// 创建权限
Permission::create(['name' => 'edit articles']);
// 创建角色
$role = Role::create(['name' => 'writer']);
// 给角色分配权限
$role->givePermissionTo('edit articles');
```
在中间件中使用
可以自定义中间件来检查用户是否有权限访问某个路由。新建中间件HasPermission.php:
```php
namespace AppHttpMiddleware;
use Closure;
use IlluminateSupportFacadesAuth;
use SpatiePermissionExceptionsUnauthorizedException;
class HasPermission
{
public function handle($request, Closure $next, ...$permissions)
{
if (Auth::guest()) {
throw UnauthorizedException::notLoggedIn();
}
$permissions = is_array(end($permissions)) ? end($permissions) : $permissions;
foreach ($permissions as $permission) {
if (Auth::user()->can($permission)) {
return $next($request);
}
}
throw UnauthorizedException::forPermissions($permissions);
}
}
php
注册中间件后,在路由中使用:
Route::get('/edit/article', [ArticleController::class,'edit'])->middleware('permission:edit articles');
```
其他思路
除了使用spatie/laravel - permission,还可以自己从头构建权限系统。这需要创建角色、权限等模型以及对应的数据库表结构,定义好它们之间的关系,比如一个用户可以有多个角色,一个角色可以有多个权限。然后在用户登录时查询其拥有的权限,在各个业务逻辑处进行权限判断。不过这种方式比较繁琐,而使用成熟的第三方包可以节省大量开发时间并且可靠性较高。