smallneat/trust

Laravel4 的角色和权限

2.0.2 2014-09-16 20:04 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:32:02 UTC


README

通过 traits 实现Laravel 4的用户角色和权限

基于 https://github.com/Zizaco/entrust 的简化思想

所需设置

composer.json 文件的 require 键中添加以下内容

"smallneat/trust": "1.*"

运行 Composer 更新命令

$ composer update

在您的 config/app.php 文件中,将 'Smallneat\Trust\TrustServiceProvider' 添加到 $providers 数组的末尾

'providers' => array(

    'Illuminate\Foundation\Providers\ArtisanServiceProvider',
    'Illuminate\Auth\AuthServiceProvider',
    ...
    'Smallneat\Trust\TrustServiceProvider',
),

配置

Trust 创建了多个表,并对您的模型名称做出了一些假设。您可以使用 Laravel 的正常配置来配置所有这些设置。首先,您需要将此包中的配置发布到您的应用配置中(如果默认名称与您应用程序中现有的表名称冲突,您只需要处理这种情况)

$ php artisan config:publish smallneat/trust

默认设置假设您的模型名称为 UserRolePermission,并且用于跟踪这些信息的表名称分别为 usersrolespermissions。Trust 还使用了 2 个枢纽表来提供用户、角色和权限之间的多对多关联,这些表分别称为 user_rolerole_permission

完成配置(或保留默认设置)后,就到了下一步。

创建数据库迁移

现在我们需要使用以下 artisan 命令创建数据库迁移

$ php artisan trust:migration

它将在您的 app/database/migrations 文件夹中生成 <timestamp>_setup_roles_permissions_tables.php 迁移文件。您现在可以使用 artisan migrate 命令运行迁移

$ php artisan migrate

迁移完成后,将出现四个新表,如上所述。

注意: 这不会为您创建 users 表。如果您还没有用户表,您需要添加一个迁移来创建一个。我们假设此表名为 users 并具有字段 user_id

在您的模型中使用 Trust

这里我们假设您已经有一个用户模型(例如,Laravel 在您构建新的 Laravel 应用时为您创建的模型),并且它在数据库中有一个匹配的表(通常称为 users)。

UserRoleTrait 特性添加到用户模型类中(通常在 app/models/User.php 中),如下所示...

<?php

...
use Smallneat\Trust\UserRoleTrait;

class User extends Eloquent implements UserInterface, RemindableInterface {

	use UserTrait, RemindableTrait, UserRoleTrait;

    ...

}

接下来,创建一个类似以下的 Role 模型...

<?php

use Smallneat\Trust\RoleTrait;

class Role extends \Eloquent {

    use RoleTrait;

	protected $fillable = [];
}

Role 模型有一个 name 属性,它是角色的名称(例如,'Admin'、'Editor'、'Manager'、'User')。您还可以使用 roles()permissions() 查找与角色关联的用户和权限。

接下来,创建一个类似以下的 Permission 模型...

<?php

use Smallneat\Trust\PermissionTrait;

class Permission extends \Eloquent {

    use PermissionTrait;

	protected $fillable = [];
}

Permission 模型有一个 name 属性,它是权限的名称(例如,'CreatePost'、'EditPost'、'DeletePost'),以及一个 description 属性,用于存储权限的可读描述(例如,用于在您的管理区域中显示)。roles() 函数将为您提供访问具有此权限的所有角色的权限。

最后,别忘了导出 composer 自动加载

$ composer dump-autoload

用法

每个用户可以关联任意数量的角色。每个角色可以授予任意数量的权限,而权限可以用来控制对您网站各个区域的访问。

角色和权限通常使用您的 DB Seeds 创建,但我们将展示创建一系列权限和角色并将它们分配给用户的示例。最后,我们将展示如何查询用户以了解他们可以做什么以及不能做什么...

首先,我们将为虚构的博客创建一些权限。这些代表您希望以某种方式保护的网站区域。

$createPost = Permission::create([
    'name' => 'CreatePost',
    'description' => 'Create new posts'
]);

$editPost = Permission::create([
    'name' => 'EditPost',
    'description' => 'Edit existing posts'
]);

$deletePost = Permission::create([
    'name' => 'DeletePost',
    'description' => 'Delete posts'
]);

$manageUsers = Permission::create([
    'name' => 'ManageUsers',
    'description' => 'Create and Delete user accounts'
]);

// plus loads more for all the areas of the site we want to control

接下来,我们将创建一些不同的角色,并将一些权限与它们关联

// Create 2 new roles for an Admin and an Editor
$admin = Role::create(['name' => 'Admin']);
$editor = Role::create(['name' => 'Editor']);

// Attach some permissions to each of the roles
// You can either pass in a Role object, and id, or an array of Roles / id's
$admin->attachPermissions([$manageUsers, $deletePosts]);
$editor->attachPermissions([$createPosts, $editPosts, $deletePosts]);

// You can access the permissions that a role has (using Eloquent) like so...
$admin->perms()

// Remove them with detachPermissions()

最后,我们可以给用户一些这些角色,并查询它们

// Give a user a role (using a Role model or id or an array of roles / id's)
$user = Auth::user();
$user->attachRoles($editor);

// Query the user
$user->hasRole('Editor');       // true
$user->hasRole('Admin');        // false
$user->can('CreatePost');       // true
$user->can('ManageUsers');      // false

// Access all the roles the user has
$user->roles();

// remove them with detachRoles()

许可证

Trust 是一款免费软件,在 MIT 许可证条款下分发

更多信息

如有问题,请在此报告