Laravel5.1框架自带权限控制系统 ACL用法分析
本文实例讲述了Laravel5.1框架自带权限控制系统ACL用法。分享给大家供大家参考,具体如下:
Laravel在5.1.11版本中加入了Authorization,可以让用户自定义权限,今天分享一种定义权限系统的方法。
1.创建角色与权限表
使用命令行创建角色与权限表:
phpartisanmake:migrationcreate_permissions_and_roles--create=permissions
之后打开刚刚创建的文件,填入下面的代码:
publicfunctionup() { Schema::create('roles',function(Blueprint$table){ $table->increments('id'); $table->string('name'); $table->string('label'); $table->string('description')->nullable(); $table->timestamps(); }); Schema::create('permissions',function(Blueprint$table){ $table->increments('id'); $table->string('name'); $table->string('label'); $table->string('description')->nullable(); $table->timestamps(); }); Schema::create('permission_role',function(Blueprint$table){ $table->integer('permission_id')->unsigned(); $table->integer('role_id')->unsigned(); $table->foreign('permission_id') ->references('id') ->on('permissions') ->onDelete('cascade'); $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->primary(['permission_id','role_id']); }); Schema::create('role_user',function(Blueprint$table){ $table->integer('user_id')->unsigned(); $table->integer('role_id')->unsigned(); $table->foreign('role_id') ->references('id') ->on('roles') ->onDelete('cascade'); $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); $table->primary(['role_id','user_id']); }); } publicfunctiondown() { Schema::drop('roles'); Schema::drop('permissions'); Schema::drop('permission_role'); Schema::drop('role_user'); }
上面的代码会创建角色表、权限表、角色与权限的中间表以及角色与用户的中间表。
2.创建模型
接下来使用命令行分别创建角色与权限模型:
phpartisanmake:modelPermission phpartisanmake:modelRole
然后分别打开Permission.php、Role.php以及User.php,加入下面的代码:
//Permissions.php publicfunctionroles() { return$this->belongsToMany(Role::class); }
//Role.php publicfunctionpermissions() { return$this->belongsToMany(Permission::class); } //给角色添加权限 publicfunctiongivePermissionTo($permission) { return$this->permissions()->save($permission); }
//User.php publicfunctionroles() { return$this->belongsToMany(Role::class); } //判断用户是否具有某个角色 publicfunctionhasRole($role) { if(is_string($role)){ return$this->roles->contains('name',$role); } return!!$role->intersect($this->roles)->count(); } //判断用户是否具有某权限 publicfunctionhasPermission($permission) { return$this->hasRole($permission->roles); } //给用户分配角色 publicfunctionassignRole($role) { return$this->roles()->save( Role::whereName($role)->firstOrFail() ); }
上面的代码实现了给角色分配权限及给用户分配角色,然后还提供了判断用户是否具有某角色及某权限的方法。
之后就给使用Laravel提供的Authorization来定义权限控制了,打开/app/Providers/AuthServiceProvider.php文件,在boot()中添加代码:
publicfunctionboot(GateContract$gate) { parent::registerPolicies($gate); $permissions=\App\Permission::with('roles')->get(); foreach($permissionsas$permission){ $gate->define($permission->name,function($user)use($permission){ return$user->hasPermission($permission); }); } }
通过上面的方法就定义好了各个权限。下面就该填充数据了。
3.填充数据
为方便起见,这里使用tinker命令行工具来添加几条测试数据:
phpartisantinker
之后进入命令行,依次输入下列命令:
//改变命名空间位置,避免下面每次都要输入App namespaceApp //创建权限 $permission_edit=newPermission $permission_edit->name='edit-post' $permission_edit->label='Caneditpost' $permission_edit->save() $permission_delete=newPermission $permission_delete->name='delete-post' $permission_delete->label='Candeletepost' $permission_delete->save() //创建角色 $role_editor=newRole $role_editor->name='editor'; $role_editor->label='Theeditorofthesite'; $role_editor->save() $role_editor->givePermissionTo($permission_edit) $role_admin=newRole $role_admin->name='admin'; $role_admin->label='Theadminofthesite'; $role_admin->save() //给角色分配权限 $role_admin->givePermissionTo($permission_edit) $role_admin->givePermissionTo($permission_delete) //创建用户 $editor=factory(User::class)->create() //给用户分配角色 $editor->assignRole($role_editor->name) $admin=factory(User::class)->create() $admin->assignRole($role_admin->name)
上面我们创建了两个权限:edit-post和delete-post,然后创建了editor和admin两个角色,editor角色拥有edit-post的权限,而admin两个权限都有。之后生成了两个用户,分别给他们分配了editor和admin的角色,即:ID1用户拥有editor角色,因此只有edit-post权限,而ID2用户拥有admin角色,因此具有edit-post和delete-post权限。下面我们来验证下是否正确。
打开routes.php文件:
Route::get('/',function(){ $user=Auth::loginUsingId(1); returnview('welcome'); })
上面我们先验证ID1用户的权限,然后修改/resources/views/welcome.blade.php文件:
Laravel 权限测试
@can('edit-post')
EditPost @endcan @can('delete-post')
DeletePost @endcan
在视图中我们通过Laravel提供的@can方法来判断用户是否具有某权限。
打开浏览器,访问上面定义的路由,可以看到视图中只出现了EditPost链接。之后我们修改路由中用户ID为2,然后再次刷新浏览器,可以看到,这次同时出现了EditPost和DeletePost两个链接,说明我们定义的权限控制起作用了。
更多关于Laravel相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。