Skip to content
本页目录

权限控制

laravel-admin内置了自动基于路由配置的RBAC权限控制模块,在用户、角色中可以进行相关操作,权限控制的使用如下:

下面以用户 复制 操作为例

设置路由

php
$router->post('users/{user}/replicate', 'UserController@replicate')
    ->name('admin.users.replicate');

重点

权限控制的重点是在路由中设置路由名称 ->name(), 并且加上 admin.

users 是分组

replicate 是操作

解释:给用户复制操作加权限控制

是的,就是这么简单,现在去用户、角色的控制面板看看效果吧,对了,记得设置翻译哦

设置方法

php
namespace App\Admin\Controllers;
use Elegant\Admin\Controllers\AdminController;
use App\Models\User;

class UserController  extends AdminController
{
  public function replicate($id)
  {
      // 方法一,在这里执行逻辑(推荐使用,安全性高)
      try {
          $model = User::find($id);
          DB::transaction(function () use ($model) {
              $model->replicate()->save();
          });
      } catch (\Exception $exception) {
          return $this->response()->error("复制失败: {$exception->getMessage()}")->send();
      }

      return $this->response()->success('复制成功')->refresh()->send();

      // 方法二,去操作类中执行逻辑(存在安全风险,可未授权执行)
      return $this->handleAction();
  }
}

这样就完成了一个页面的权限控制。

设置操作类

php
namespace App\Admin\Actions;
    
use Elegant\Admin\Actions\RowAction;
//use Elegant\Admin\Actions\TreeAction;// 模型树操作请继承此类
//use Elegant\Admin\Actions\NavAction;// 头部导航条操作请继承此类
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\DB;
    
class Replicate extends RowAction
{
    /**
     * @var string
     */
    protected $method = 'POST';

    /**
     * @return array|null|string
     */
    public function name()
    {
        return '复制';
    }

    /**
     * 如果是模型树和头部导航条操作,需要此方法
     * @return string
     */
    //protected function icon()
    //{
    //    return 'fa-bars';
    //}

    /**
     * 如果没有此方法,将不会有权限的控制
     * @return string
     */
    public function getHandleRoute()
    {
        // 这里配置路由的路径
        return "{$this->getResource()}/{$this->getKey()}/replicate";
    }

    /**
     * 这是方法二的逻辑
     * @param Model $model
     *
     * @return \Elegant\Admin\Actions\Response
     */
    //public function handle(Model $model)
    //{
    //    try {
    //        DB::transaction(function () use ($model) {
    //            $model->replicate()->save();
    //        });
    //    } catch (\Exception $exception) {
    //        return $this->response()->error("复制失败: {$exception->getMessage()}");
    //    }
    //
    //    return $this->response()->success("复制成功")->refresh();
    //}

    /**
     * @return void
     */
    public function dialog()
    {
        $this->question('确认复制?', '', ['confirmButtonColor' => '#d33']);
    }
}

相关方法

获取当前用户对象

php
Admin::user();

获取当前用户id

php
Admin::user()->id;

获取用户角色

php
Admin::user()->roles;

获取用户的权限

php
Admin::user()->permissions;

用户是否某个角色

php
Admin::user()->isRole('developer');

是否有某个权限

php
Admin::user()->can('create-post');

是否没有某个权限

php
Admin::user()->cannot('delete-post');

是否是超级管理员

php
Admin::user()->isAdministrator();

是否是其中的角色

php
Admin::user()->inRoles(['editor', 'developer']);

权限中间件

可以在路由配置上结合权限中间件来控制路由的权限

php
// 允许administrator、editor两个角色访问group里面的路由
Route::group([
    'middleware' => 'admin.permission:allow,administrator,editor',
], function ($router) {

    $router->resource('users', UserController::class);
    ...

});

// 禁止developer、operator两个角色访问group里面的路由
Route::group([
    'middleware' => 'admin.permission:deny,developer,operator',
], function ($router) {

    $router->resource('users', UserController::class);
    ...

});

// 有edit-post、create-post、delete-post三个权限的用户可以访问group里面的路由
Route::group([
    'middleware' => 'admin.permission:check,edit-post,create-post,delete-post',
], function ($router) {

    $router->resource('posts', PostController::class);
    ...

});

权限中间件和其它中间件使用方法一致。