Laravel中如何使用php-casbin
一、🚀 安装和配置
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('文章', '编辑');
三、🛡️ 中间件使用
- 基础 Enforcer 中间件
// 保护需要特定权限的路由
Route::group(['middleware' => ['enforcer:文章,编辑']], function () {Route::put('/articles/{id}', 'ArticleController@update');
});// 保护需要角色的路由
Route::group(['middleware' => ['enforcer:管理员']], function () {Route::get('/admin', 'AdminController@index');
});
- 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/*', '.*');
四、⚙️ 高级配置
- 多个 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('张三', '订单', '查看');
- 缓存配置
在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 "张三" "编辑者"
六、🔧 实际应用示例
- 在控制器中使用
<?phpnamespace 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'));}
}
- 在 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
- 用户注册时分配默认角色
// 在用户注册后
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');
}