使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(二):使用篇

WBOY
Release: 2016-06-23 13:12:43
Original
1325 people have browsed it

在上一篇教程中我们讨论了如何安装配置Entrust,这一篇我们来详细讨论其使用方法。

1、创建角色/权限并进行分配

首先我们来创建 Role和 Permission:

$owner = new Role();$owner->name = 'owner';$owner->display_name = 'Project Owner';$owner->description = 'User is the owner of a given project';$owner->save();$admin = new Role();$admin->name = 'admin';$admin->display_name = 'User Administrator';$admin->description = 'User is allowed to manage and edit other users';$admin->save();
Copy after login

接下来我们将创建的两个roles分配给用户:

$user = User::where('username', '=', 'michele')->first();//调用hasRole提供的attachRole方法$user->attachRole($admin); // 参数可以是Role对象,数组或id// 或者也可以使用Eloquent原生的方法$user->roles()->attach($admin->id); //只需传递id即可
Copy after login

现在我们还需要添加相应权限到这些角色上:

$createPost = new Permission();$createPost->name = 'create-post';$createPost->display_name = 'Create Posts';$createPost->description = 'create new blog posts';$createPost->save();$editUser = new Permission();$editUser->name = 'edit-user';$editUser->display_name = 'Edit Users';$editUser->description = 'edit existing users';$editUser->save();$admin->attachPermission($createPost);//等价于 $admin->perms()->sync(array($createPost->id));$owner->attachPermissions(array($createPost, $editUser));//等价于 $owner->perms()->sync(array($createPost->id, $editUser->id));
Copy after login

2、检查角色&权限

完成上述操作后,下面我们可以检查相应角色和权限:

$user->hasRole('owner'); // false$user->hasRole('admin'); // true$user->can('edit-user'); // false$user->can('create-post'); // true
Copy after login

hasRole()和 can都可以接收数组形式的角色和权限进行检查:

$user->hasRole(['owner', 'admin']); // true$user->can(['edit-user', 'create-post']); // true
Copy after login

默认情况下,如果用户拥有以上任意一个角色或权限都会返回 true,如果你想检查用户是否拥有所有角色及权限,可以传递 true作为第二个参数到相应方法:

$user->hasRole(['owner', 'admin']); // true$user->hasRole(['owner', 'admin'], true); // false$user->can(['edit-user', 'create-post']); // true$user->can(['edit-user', 'create-post'], true); // false
Copy after login

用户可以拥有多个角色。

除此之外,还可以通过 Entrust门面检查当前登录用户是否拥有指定角色和权限:

Entrust::hasRole('role-name');Entrust::can('permission-name');
Copy after login

甚至还可以通过通配符的方式来检查用户权限:

// match any admin permission$user->can("admin.*"); // true// match any permission about users$user->can("*_users"); // true
Copy after login

3、ability方法

还可以通过使用 ability方法来实现更加高级的检查,这需要三个参数(角色、权限、选项),同样角色和权限既可以是字符串也可以是数组:

$user->ability(array('admin', 'owner'), array('create-post', 'edit-user'));// 或者$user->ability('admin,owner', 'create-post,edit-user');
Copy after login

这将会检查用户是否拥有任意提供的角色和权限,在本例中会返回 true,因为用户的角色是 admin并且拥有 create-post权限。

第三个参数是一个可选数组:

$options = array(    'validate_all' => true | false (Default: false),    'return_type' => boolean | array | both (Default: boolean));
Copy after login

其中 validate_all是一个布尔值,用于设置是否检查所有值; return_type用于指定返回布尔值、检查值数组还是两者都有。

下面是一个输出示例:

$options = array(    'validate_all' => true,    'return_type' => 'both');list($validate, $allValidations) = $user->ability(    array('admin', 'owner'),    array('create-post', 'edit-user'),    $options);var_dump($validate);// bool(false)var_dump($allValidations);// array(4) {//     ['role'] => bool(true)//     ['role_2'] => bool(false)//     ['create-post'] => bool(true)//     ['edit-user'] => bool(false)// }
Copy after login

同样, Entrust门面也为当前登录用户提供了 ability方法:

Entrust::ability('admin,owner', 'create-post,edit-user');// 等价于Auth::user()->ability('admin,owner', 'create-post,edit-user');
Copy after login

4、Blade模板

在Blade模板中也可以使用上述三个方法对应的指令:

@role('admin')    <p>This is visible to users with the admin role. Gets translated to    \Entrust::role('admin')</p>@endrole@permission('manage-admins')    <p>This is visible to users with the given permissions. Gets translated to    \Entrust::can('manage-admins'). The @can directive is already taken by core    laravel authorization package, hence the @permission directive instead.</p>@endpermission@ability('admin,owner', 'create-post,edit-user')    <p>This is visible to users with the given abilities. Gets translated to    \Entrust::ability('admin,owner', 'create-post,edit-user')</p>@endability
Copy after login

中间件

你可以在中间件中通过角色或权限来过滤路由以及路由群组:

Route::group(['prefix' => 'admin', 'middleware' => ['role:admin']], function() {    Route::get('/', 'AdminController@welcome');    Route::get('/manage', [        'middleware' => ['permission:manage-admins'],         'uses' => 'AdminController@manageAdmins'    ]);});
Copy after login

支持OR/AND逻辑:

'middleware' => ['role:admin|root']'middleware' => ['permission:owner', 'permission:writer']
Copy after login

同样可以使用 ability中间件:

'middleware' => ['ability:admin|owner,create-post|edit-user,true']
Copy after login

5、路由过滤器的快捷实现

通过权限和角色过滤路由你还可以在 app/Http/routes.php调用如下代码:

// 只有拥有'create-post'权限对应角色的用户才能访问admin/post*Entrust::routeNeedsPermission('admin/post*', 'create-post');// 只有所有者才能访问admin/advanced*Entrust::routeNeedsRole('admin/advanced*', 'owner');// 第二个参数可以是数组,这样用户必须满足所有条件才能访问对应路由Entrust::routeNeedsPermission('admin/post*', array('create-post', 'edit-comment'));Entrust::routeNeedsRole('admin/advanced*', array('owner','writer'));
Copy after login

以上方法都可以接受第三个参数,如果第三个参数为空那么禁止访问默认调用 App::abort(403),否则会返回第三个参数,所以我们可以这么做:

Entrust::routeNeedsRole('admin/advanced*', 'owner', Redirect::to('/home'));
Copy after login

甚至还可以接受第四个参数,该参数默认为 true,意味着将会检查提供的所有角色和权限,如果你将其设置为 false,则该方法只有在所有角色/权限都不满足才会返回失败:

// 如果用户拥有'create-post'、'edit-comment'其中之一或者两个权限都具备则可以访问Entrust::routeNeedsPermission('admin/post*', array('create-post', 'edit-comment'), null, false);// 如果用户是所有者、作者或者都具备则可以访问Entrust::routeNeedsRole('admin/advanced*', array('owner','writer'), null, false);Entrust::routeNeedsRoleOrPermission(    'admin/advanced*',    array('owner', 'writer'),    array('create-post', 'edit-comment'),    null,    false);
Copy after login

6、路由过滤器

Entrust角色/权限可通过调用 Entrust门面上的 can和 hasRole方法应用在过滤器中:

Route::filter('manage_posts', function(){    // check the current user    if (!Entrust::can('create-post')) {        return Redirect::to('admin');    }});// 只有用户对应角色拥有 'manage_posts' 权限才能访问任意 admin/post 路由Route::when('admin/post*', 'manage_posts');
Copy after login

使用过滤器来检查角色:

Route::filter('owner_role', function(){    // check the current user    if (!Entrust::hasRole('Owner')) {        App::abort(403);    }});// 只有所有者才能访问 admin/advanced* 路由Route::when('admin/advanced*', 'owner_role');
Copy after login

正如你所看到的, Entrust::hasRole和 Entrust::can方法检查用户是否登录、然后才去判断他们是否有用指定角色或权限,如果用户没有登录则直接返回 false。

如果想要查看在Laravel 5.2中基于Entrust实现后台权限管理的实例可参考Ryan的这个Github项目: https://github.com/yuansir/laravel5-rbac-example

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template