Skip to content

LIMS RBAC 快速开始

5 分钟快速上手

1. 运行同步(首次)

bash
# 同步 Legacy 数据到 RBAC 表
php artisan lims:rbac-sync

# 验证同步结果
php artisan lims:rbac-verify

2. User Model 混入 Trait

php
<?php

namespace App\Models;

use App\Foundation\Rbac\Concerns\HasLimsPermissions;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasLimsPermissions;  // 添加这一行
}

3. 三种使用方式

方式 1:User Model Trait(推荐)

php
$user = Auth::user();

// 检查权限
if ($user->hasPermission('sample.add')) {
    // 有权限
}

// 检查菜单
if ($user->canViewMenu(123)) {
    // 可见
}

方式 2:Facade

php
use App\Foundation\Rbac\Facades\LimsRbac;

// 检查当前用户
if (LimsRbac::check('sample.add')) {
    // 有权限
}

// 检查指定用户
if (LimsRbac::userCan($userId, 'sample.add')) {
    // 有权限
}

方式 3:Laravel Gate(自动集成)

php
// 控制器
$this->authorize('sample.add');

// Blade
@can('sample.add')
    <button>添加</button>
@endcan

4. 路由保护

php
// 单个权限
Route::get('/sample', [SampleController::class, 'index'])
    ->middleware('lims.permission:sample.view');

// 多个权限(OR)- 分号分隔
Route::post('/sample', [SampleController::class, 'store'])
    ->middleware('lims.permission:sample.add;sample.edit');

// 多个权限(AND)- 最后加 ;and
Route::delete('/sample/{id}', [SampleController::class, 'destroy'])
    ->middleware('lims.permission:sample.delete;sample.manage;and');

注意:使用分号(;)而非逗号分隔多个权限。


5. Blade 模板

blade
{{-- 检查权限 --}}
@permission('sample.add')
    <button>添加样品</button>
@endpermission

{{-- 检查菜单 --}}
@canViewMenu(123)
    <a href="/sample">样品管理</a>
@endcanViewMenu

完整示例

控制器

php
<?php

namespace App\Http\Controllers;

use App\Foundation\Rbac\Facades\LimsRbac;
use Illuminate\Http\Request;

class SampleController extends Controller
{
    public function __construct()
    {
        $this->middleware('lims.permission:sample.view')->only(['index']);
    }

    public function index()
    {
        // Laravel Gate 鉴权
        $this->authorize('sample.view');

        return view('sample.index');
    }

    public function store(Request $request)
    {
        // Facade 鉴权
        if (!LimsRbac::check('sample.add')) {
            abort(403);
        }

        // 业务逻辑
    }
}

Blade 视图

blade
<div class="container">
    <h1>样品管理</h1>

    @permission('sample.add')
        <a href="{{ route('sample.create') }}" class="btn btn-primary">
            添加样品
        </a>
    @endpermission

    <table>
        @foreach($samples as $sample)
            <tr>
                <td>{{ $sample->name }}</td>
                <td>
                    @can('sample.edit')
                        <a href="{{ route('sample.edit', $sample) }}">编辑</a>
                    @endcan

                    @permission('sample.delete')
                        <button onclick="deleteSample({{ $sample->id }})">删除</button>
                    @endpermission
                </td>
            </tr>
        @endforeach
    </table>
</div>

配置

开发环境(推荐)

env
# .env
RBAC_ENFORCE=false  # 不拦截,仅供测试
RBAC_CACHE_TTL_MINUTES=10

生产环境

env
# .env
RBAC_ENFORCE=true  # 启用拦截
RBAC_CACHE_TTL_MINUTES=10

常用命令

bash
# 同步权限
php artisan lims:rbac-sync

# 验证同步结果
php artisan lims:rbac-verify

# 清除配置缓存
php artisan config:clear

# 测试服务加载
php artisan tinker
> app(\App\Foundation\Rbac\Contracts\PermissionChecker::class)

清除缓存

php
// 清除当前用户缓存
Auth::user()->clearPermissionCache();

// 清除指定用户缓存
use App\Foundation\Rbac\Facades\LimsRbac;
LimsRbac::clearUserCache($userId);

文档链接


故障排查

权限检查不生效?

  1. 检查 RBAC_ENFORCE 是否为 true
  2. 运行 php artisan lims:rbac-sync 同步数据
  3. 清除缓存:Auth::user()->clearPermissionCache()

Blade 指令不工作?

  1. 检查 LimsRbacServiceProvider 是否已注册
  2. 运行 php artisan config:clear
  3. 重启开发服务器

中间件 403?

  1. 检查用户是否已登录
  2. 检查权限代码是否正确
  3. 查看日志:storage/logs/laravel.log

下一步

  1. 阅读使用指南
  2. 需要同步或核对 Legacy 数据时,阅读同步规范
  3. 调整基础实现前,阅读Foundation 架构