Laravel中如何使用php-casbin

发布于:2025-08-19 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、🚀 安装和配置

1. 安装包

composer require casbin/laravel-authz

2. 发布配置文件

php artisan vendor:publish

这会生成两个重要文件:

  • config/lauthz.php - 主配置文件
  • config/lauthz-rbac-model.conf - RBAC 模型配置文件

3. 运行数据库迁移

php artisan migrate

这里会创建 rules 表来存储权限规则。

二、💡 基本使用方法

权限管理基础操作:

use Enforcer;

// 为用户添加直接权限
Enforcer::addPermissionForUser('张三', '文章', '读取');
Enforcer::addPermissionForUser('张三', '文章', '编辑');

// 为用户分配角色
Enforcer::addRoleForUser('张三', '编辑者');

// 为角色添加权限
Enforcer::addPolicy('编辑者', '文章', '编辑');
Enforcer::addPolicy('编辑者', '文章', '发布');

// 检查权限
if (Enforcer::enforce('张三', '文章', '编辑')) {
    echo "张三可以编辑文章";
} else {
    echo "张三没有编辑文章的权限";
}

常用 API 方法

角色管理

// 获取所有角色
$roles = Enforcer::getAllRoles();

// 获取用户的所有角色
$userRoles = Enforcer::getRolesForUser('张三');

// 获取拥有某角色的所有用户
$users = Enforcer::getUsersForRole('编辑者');

// 检查用户是否有某角色
$hasRole = Enforcer::hasRoleForUser('张三', '编辑者');

// 删除用户的角色
Enforcer::deleteRoleForUser('张三', '编辑者');

// 删除用户的所有角色
Enforcer::deleteRolesForUser('张三');

权限管理

// 获取用户的所有权限
$permissions = Enforcer::getPermissionsForUser('张三');

// 检查用户是否有某权限
$hasPermission = Enforcer::hasPermissionForUser('张三', '文章', '编辑');

// 删除用户的权限
Enforcer::deletePermissionForUser('张三', '文章', '编辑');

// 删除用户的所有权限
Enforcer::deletePermissionsForUser('张三');

// 删除某个权限(所有拥有此权限的用户都会失去)
Enforcer::deletePermission('文章', '编辑');

三、🛡️ 中间件使用

  1. 基础 Enforcer 中间件
// 保护需要特定权限的路由
Route::group(['middleware' => ['enforcer:文章,编辑']], function () {
    Route::put('/articles/{id}', 'ArticleController@update');
});

// 保护需要角色的路由
Route::group(['middleware' => ['enforcer:管理员']], function () {
    Route::get('/admin', 'AdminController@index');
});
  1. RESTful HTTP 请求中间件

首先配置模型文件 config/lauthz-rbac-model.conf

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)

然后在路由中使用:

Route::group(['middleware' => ['http_request']], function () {
    Route::resource('articles', 'ArticleController');
});

为角色添加 RESTful 权限:

// 允许编辑者对所有文章进行 GET 和 POST 操作
Enforcer::addPolicy('编辑者', '/articles/*', '(GET)|(POST)');
// 允许管理员进行所有操作
Enforcer::addPolicy('管理员', '/articles/*', '.*');

四、⚙️ 高级配置

  1. 多个 Enforcer 配置

config/lauthz.php 中配置多个权限控制器:

return [
    'default' => 'basic',

    'basic' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path('lauthz-rbac-model.conf'),
        ],
        'adapter' => Lauthz\Adapters\DatabaseAdapter::class,
    ],

    'advanced' => [
        'model' => [
            'config_type' => 'file',
            'config_file_path' => config_path('lauthz-advanced-model.conf'),
        ],
        'adapter' => Lauthz\Adapters\DatabaseAdapter::class,
    ],
];

使用指定的 Enforcer:

Enforcer::guard('advanced')->enforce('张三', '订单', '查看');
  1. 缓存配置
    config/lauthz.php 中启用缓存:
'cache' => [
    'enabled' => true,        // 启用缓存
    'store' => 'default',     // 缓存存储驱动
    'key' => 'lauthz_rules',  // 缓存键前缀
    'ttl' => 24 * 60,         // 缓存时间(分钟)
],

五、🖥️ Artisan 命令

# 为用户添加策略
php artisan policy:add "张三,文章,编辑"

# 为角色添加策略
php artisan policy:add "编辑者,文章,发布"

# 为用户分配角色
php artisan role:assign "张三" "编辑者"

六、🔧 实际应用示例

  1. 在控制器中使用
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Enforcer;

class ArticleController extends Controller
{
    public function edit($id, Request $request)
    {
        $user = $request->user();
        
        // 检查用户是否有编辑权限
        if (!Enforcer::enforce($user->name, '文章', '编辑')) {
            abort(403, '您没有编辑文章的权限');
        }
        
        // 继续处理编辑逻辑
        // ...
    }
    
    public function index(Request $request)
    {
        $user = $request->user();
        
        // 根据用户权限显示不同内容
        if (Enforcer::enforce($user->name, '文章', '管理')) {
            // 显示所有文章
            $articles = Article::all();
        } else {
            // 只显示用户自己的文章
            $articles = Article::where('user_id', $user->id)->get();
        }
        
        return view('articles.index', compact('articles'));
    }
}
  1. 在 Blade 模板中使用
@if(Enforcer::enforce(auth()->user()->name, '文章', '编辑'))
    <a href="{{ route('articles.edit', $article->id) }}" class="btn btn-primary">
        编辑文章
    </a>
@endif

@if(Enforcer::enforce(auth()->user()->name, '文章', '删除'))
    <form method="POST" action="{{ route('articles.destroy', $article->id) }}">
        @csrf
        @method('DELETE')
        <button type="submit" class="btn btn-danger">删除文章</button>
    </form>
@endif
  1. 用户注册时分配默认角色
// 在用户注册后
public function register(Request $request)
{
    $user = User::create([
        'name' => $request->name,
        'email' => $request->email,
        'password' => Hash::make($request->password),
    ]);
    
    // 为新用户分配默认角色
    Enforcer::addRoleForUser($user->name, '普通用户');
    
    return redirect()->route('home');
}

网站公告

今日签到

点亮在社区的每一天
去签到