php - Laravel 5 基于角色的访问控制

标签 php laravel laravel-5 laravel-5.1 rbac

我正在尝试为我的应用程序提出一个高效且灵活的 RBAC 解决方案。我做了一些研究,并认为我已经创建了以下内容。

在我的用户模型中,我有:

...
public function role() {
        return $this->belongsToMany('App\Models\Role', 'user_roles');
    }

    public function hasRole($role) {
        if($this->role->where('name', $role)->first())
            return true;
    }
...

以及使用示例:

Route::group(['middleware' => 'auth'], function () {

    Route::get('/dashboard', function () {
        if (Auth::user()->hasRole('Sales')) {
            return view('dashboards/sales');
        } else {
            return 'Don\'t know where to send you :(';
        }
    });

});

权限已分配给角色,但在上面的示例中未检查权限。然后将角色分配给用户,一个用户可以拥有多个角色。

我做事的方式是可扩展的并且是有效的 RBAC 解决方案吗?

最佳答案

我制作了一些 RBAC 应用程序,这取决于您面临的挑战类型,例如

用户有一个角色,但您希望特定用户有权访问某些区域,例如帖子,现在用户可以像版主一样编辑帖子。在这种情况下,权限方法比角色方法更适合。

通过 slug 定义访问权限,其他字段可以用作对 super 管理员的引用,或者具有讽刺意味的是编辑者角色,从现在开始,编辑者角色加上允许新的“区域”。

public function up()
{
    Schema::create('permissions', function (Blueprint $table) {
        $table->increments('id')->unsigned();
        $table->string('name');
        $table->string('slug')->unique();
        $table->string('description')->nullable();
        $table->string('model')->nullable();
    });
}

作为内容数据的示例,

$createUsersPermission = Permission::create([
    'name' => 'Create permissions',
    'slug' => 'create.permissions',
    ...
]); 

以及使用示例:

if ($user->can('create.permissions') { // you can pass an id or slug
    //
}

个人preference ,并且从未使用过Zizaco Entrust正如其他人所建议的那样,但它的工作方式相同。而且你也有等级方法。

关于php - Laravel 5 基于角色的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32543263/

相关文章:

php - PHP 中 C++ 的虚函数相当于什么?

php - 第 4 行警告 : mysql_result(): supplied argument is not a valid MySQL result resource in (. ..)

php - 如何在 vue 组件中使用 Laravel Assets

php - 显示表的名称而不是其 id Laravel

php - 服务器聊天应用程序

php - Laravel 4.2 查询生成器无法正常工作

php - Laravel Eloquent ORM 事务

php - 使用 MySQL 进行 Laravel 5 服务 API 查询

php - Laravel中的前端错误显示架构

php - Symfony\Component\Routing\Exception\RouteNotFoundException;路线 [home.getstarted] 未定义