【问题标题】:Laravel 5 role based access controlLaravel 5 基于角色的访问控制
【发布时间】:2015-12-09 04:24:09
【问题描述】:

我正在尝试为我的应用提供一种高效灵活的 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 解决方案?

【问题讨论】:

标签: php laravel laravel-5 laravel-5.1 rbac


【解决方案1】:

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

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

通过 slug 定义访问,其他字段可以用作对 Super Admin 的引用,或者具有讽刺意味的是 Editor Role,从现在开始,一个 Editor Role 加上新“区域”的许可。

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,但它的工作方式相同。你也有水平方法。

【讨论】:

    【解决方案2】:

    我做了一点不同,我在 UserRole 中创建了 hasRole,而不是 User(影响不大,但根据代码应该如此)。所以这是我的路线:

    Route::group(['middleware' => 'auth'], function () {
    Route::get('/myProfile', function () {
        if (App\UserRole::hasRole('ROLE_CUSTOMER',Auth::user())) {
            return view('views/customer');
        } else {
            return 'Don\'t know where to send you :(';
        }
    }); });
    

    接下来是,我的 UserRole 中的方法。我尽量保持简单:

    public static function hasRole($authority,$user) {
            $role = Role::where('authority',$authority)->first();
            $userRole = UserRole::where('role_id',$role->id)
                        ->where('user_id',$user->id)->first();
            if($userRole){
                return true;
            }
        }
    

    我们查找权限(ROLE_USER、ROLE_CUSTOMER 等),$user 是从 DB 检索到的用户对象。 其他一切都根据您的问题运行/ 希望能帮助到你! 干杯!

    【讨论】:

      【解决方案3】:

      由于 laravel 中基于角色的身份验证没有现成的解决方案。您可以创建一个自定义角色表来定义您的应用程序可以拥有的所有可能的角色,以及包含用户和角色关联的 role_user 表。

      您可以在 User 模型下创建方法来检查用户是否属于特定角色。使用该方法注册一个新的中间件。中间件可以附加到路由或控制器。

      此链接中给出了详细的演示 https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/

      【讨论】:

        猜你喜欢
        • 2010-09-11
        • 2013-08-28
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多