web-dev-qa-db-ja.com

Laravel 5ロールベースのアクセス制御

私は自分のアプリのための効率的で柔軟な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ソリューションですか?

13
imperium2335

私はいくつかのRBACアプリを作成しましたが、それはあなたが直面している課題の種類によって異なります。

ユーザーには役割がありますが、特定のユーザーがPostsなどの特定の領域にアクセスできるようにしたい場合、ユーザーはモデレーターのように投稿を編集できます。 -)。この場合の権限アプローチは、単なる役割アプローチよりも適しています。

スラッグによるアクセスを定義します。他のフィールドは、Super Adminへの参照として、または皮肉なことにの参照として使用できます。編集者の役割、今から、編集者の役割と新しい「領域」へのアクセス許可。

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 他の人々によって提案されたように、しかしそれは同じように機能します。また、レベルアプローチもあります。

3
AndreL

私は少し違うことをしました、私は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
89n3ur0n

Laravelのロールベース認証に利用できるすぐに使えるソリューションがないため。アプリケーションが持つことができるすべての可能なロールを定義するカスタムロールテーブルと、ユーザーとロールの関連付けを含むrole_userテーブルを作成できます。

ユーザーモデルの下にメソッドを作成して、ユーザーが特定のロールに属しているかどうかを確認できます。そのメソッドを利用して、新しいミドルウェアを登録します。ミドルウェアは、ルートまたはコントローラーに接続できます。

詳細なデモはこのリンクにあります https://www.5balloons.info/user-role-based-authentication-and-access-control-in-laravel/

0
Tushar