当前位置: 首页 > 后端技术 > PHP

Laravel-Authorization:在Laravel中使用Casbin(PHP权限管理框架)

时间:2023-03-30 01:51:00 PHP

PHP-Casbin是一个轻量级的开源访问控制框架,使用PHP语言构建(https://github.com/php-casbin...),目前开源在GitHub上。PHP-Casbin采用元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制RBAC、基于属性的访问控制ABAC等。Laraval-Authorization是为Casbin定制的扩展包Laravel(https://github.com/php-casbin...)。使用Composer安装:composerrequirecasbin/laravel-authzLauthz\LauthzServiceProvider是默认自动发现和注册的,但是如果你想自己注册,你可以在config/app.php中添加ServiceProvider:'providers'=>[/**PackageServiceProviders...*/Lauthz\LauthzServiceProvider::class,]Enforcerfacade也是自动发现的,但是如果你想手动添加,在config/app.php中添加:'aliases'=>[//...'Enforcer'=>Lauthz\Facades\Enforcer::class,]要发布配置,请运行vendor:publish命令:phpartisanvendor:publish这将自动创建模型配置文件config/lauthz-rbac-model.conf和一个新的Lauthz配置文件config/lauthz.php。要迁移迁移,请运行迁移命令:phpartisanmigrate这将创建一个规则表。安装后,您可以执行以下操作:useEnforcer;//向用户添加权限Enforcer::addPermissionForUser('eve','articles','read');//为用户添加角色。Enforcer::addRoleForUser('eve','writer');//添加权限到ruleEnforcer::addPolicy('writer','articles','edit');您可以按如下方式验证用户权限://检查用户是否有权限if(Enforcer::enforce("eve","articles","edit")){//允许eve编辑文章}else{//拒绝请求,显示错误}使用EnforcerApi,它提供了一个非常丰富的API来促进对策略的各种操作:获取所有角色:Enforcer::getAllRoles();//['writer','reader']获取所有角色的授权规则:Enforcer::getPolicy();获取用户的所有角色:Enforcer::getRolesForUser('eve');//['writer']获取某个角色的所有用户:Enforcer::getUsersForRole('writer');//['eve']判断用户是否有角色:Enforcer::hasRoleForUser('eve','writer');//true或false为用户添加一个角色:Enforcer::addRoleForUser('eve','writer');为用户或角色授予权限://touserEnforcer::addPermissionForUser('eve','articles','read');//toroleEnforcer::addPermissionForUser('writer','ar小贴士','编辑');删除用户角色:Enforcer::deleteRoleForUser('eve','writer');删除用户的所有角色:Enforcer::deleteRolesForUser('eve');删除单个角色:Enforcer::deleteRole('writer');删除权限:Enforcer::deletePermission('articles','read');//如果权限不存在(又名不受影响),则返回false。删除用户或角色权限:Enforcer::deletePermissionForUser('eve','articles','read');删除用户或角色的所有权限://touserEnforcer::deletePermissionsForUser('eve');//toroleEnforcer::deletePermissionsForUser('writer');获取用户或角色的所有权限:Enforcer::getPermissionsForUser('eve');//返回数组认为用户是否具有特定权限:Enforcer::hasPermissionForUser('eve','articles','read');//trueorfalse更多API参考CasbinAPIusingmiddleware本扩展包有EnforcerMiddleware和RequestMiddleware中间件。您可以将它们添加到您的app/Http/Kernel.php文件中:请求中间件'http_request'=>\Lauthz\Middlewares\RequestMiddleware::class,];然后可以使用基本的Enforcer中间件来保护路由:Route::group(['middleware'=>['enforcer:articles,read']],function(){//pass});HTTP请求中间件(支持RESTful)如果需要授权一个请求,需要先在config/lauthz-rbac-model.conf中定义model配置:[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)&®exMatch(r.act,p.act)然后,使用中间件规则:Route::group(['middleware'=>['http_request']],function(){Route::resource('照片','PhotoController');});多个决策者如果你的项目中需要多个权限控制,你可以配置多个决策者。在lauthz配置文件中,应该这样配置:return['default'=>'basic','basic'=>['model'=>[//...],'adapter'=>Lauthz\Adapters\DatabaseAdapter::class,//...],'second'=>['model'=>[//...],'adapter'=>Lauthz\Adapters\DatabaseAdapter::class,//。..],];然后选择使用哪个决策者:Enforcer::guard('second')->enforce("eve","articles","edit");Artisan命令行您可以使用artisan命令在控制台中创建策略:为用户添加策略:phpartisanpolicy:addeve,articles,read为角色添加策略:phpartisanpolicy:addwriter,articles,edit分配角色给users:phpartisanrole:assignevewriterCache缓存授权规则可以提高性能,默认关闭。在Laravel的config/lauthz.php中设置你自己的缓存配置:'cache'=>[//改变Lauthz是否缓存规则。'enabled'=>false,//缓存存储'store'=>'default',//缓存键'key'=>'rules',//ttl\DateTimeInterface|\DateInterval|int|null'ttl'=>24*60,],更多Casbin官网:https://casbin.orgLaraval-Casbin更多用法:https://github.com/php-casbin...有问题联系作者,请提交Issues:https://github.com/php-casbin...或者加入QQ群:546057381(Casbin门禁讨论群)