Phân quyền laravel sử dụng Entrust

https://github.com/Zizaco/entrust
Tạo 1 project laravel xong dùng lệnh php artisan make:auth để tạo login và register của thằng laravel
Đầu tiên copy đoạn code này vào file composer.json mục required
"zizaco/entrust": "5.2.x-dev"
sau đó chạy composer update
Tiếp theo vào config/app.php khai báo như sau:
providers: Zizaco\Entrust\EntrustServiceProvider::class,

aliases : 'Entrust'   => Zizaco\Entrust\EntrustFacade::class,
Sau đó chạy lệnh: php artisan vendor:publish
nếu ai bị lỗi
[Symfony\Component\Debug\Exception\FatalThrowableError]
  Class 'Zizaco\Entrust\EntrustServiceProvider' not found
cách giải quyết lỗi này là bạn vào: vendor/zizaco/entrust/src/entrust/EntrustServiceProvider.php
tìm bindShared đổi thành app->singleton
vào App/http/kernel.php mục $routeMiddleware
    'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
    'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
    'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,

xong phần cài đặt.
chạy lệnh: php artisan entrust:migration rồi ấn [yes]
nếu lỗi (Method Zizaco\Entrust\MigrationCommand::handle() does not exist)
thì làm như sau: vendor-> zizaco-> entrust-> src-> commands-> MigrationCommand.php đổi fire thành handle
nó sẽ tạo ra 1 file migration: <timestamp>_entrust_setup_tables.php
tiếp theo chạy lệnh: php artisan migrate
nó sẽ tạo ra 4 bảng trong csdl gồm:
roles: chứa vai trò
permissions: các quyền
role_user: quan hệ nhiều - nhiều
permission_role: quan hệ nhiều - nhiều
sau đó tạo model Role dùng lệnh: php artisan:model Role
Trong model Role làm như sau:
<?php

namespace App;

use Zizaco\Entrust\EntrustRole;

class Role extends EntrustRole
{
public function users() {
    return $this->belongsToMany('App\User');
    }

    public function permissions() {
        return $this->belongsToMany('App\Permission');
    }
}

Tạo tiếp model Permission
<?php

namespace App;

use Zizaco\Entrust\EntrustPermission;

class Permission extends EntrustPermission
{
public function roles() {
     return $this->belongsToMany('App\Role');
    }
}
Trong model User
thêm EntrustUserTrait vào use Notifiable
use Notifiable, EntrustUserTrait;
tạo RolesTableSeeder bằng lệnh: php artisan make:seeder RolesTableSeeder
trong database/seeds/RolesTableSeeder.php
Bạn tạo như này cho mình còn phần admin, superadmin, mod bạn tạo theo ý của bạn.
<?php

use Illuminate\Database\Seeder;
use App\Role;

class RolesTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
    $super = new Role();
    $super->name = 'superadmin';
    $super->display_name = 'Super Admin';
    $super->save();

    $admin = new Role();
    $admin->name = 'admin';
    $admin->display_name = 'Admin';
    $admin->save();

    $mod = new Role();
    $mod->name = 'mod';
    $mod->display_name = 'Mod';
    $mod->save();
    }
}
Trong file .env chuyển thành CACHE_DRIVER=array
Chạy seeder: php artisan db:seed --class=RolesTableSeeder
Nó sẽ tạo dữ liệu cho bảng roles
Tạo tiếp 1 seeder cho user: php artisan db:seed --class=UsersTableSeeder
<?php

use Illuminate\Database\Seeder;
use App\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $user = new User;
        $user->name = 'test';
        $user->email = 'khanhhb@gmail.com';
        $user->password = bcrypt('12345789');
        $user->avatar = 'avatar1.jpg';
        $user->phone = '09999999';
        $user->address = 'Hà nội';
        $user->save();
        // add role
        $user->roles()->attach(3);
    }
}
Trong model User
<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

use Zizaco\Entrust\Traits\EntrustUserTrait;
class User extends Authenticatable
{
    use Notifiable, EntrustUserTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
          'name', 'avatar', 'intro', 'email', 'password', 'level', 'status',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function roles() {
        return $this->belongsToMany('App\Role');
    }
}
Trong model role
<?php

namespace App\Models;

use Zizaco\Entrust\EntrustRole;
use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
public function users() {
return $this->belongsToMany('App\Models\User');
}

public function permissions() {
return $this->belongsToMany('App\Models\Permission');
}
}
Trong UserController
    public function createUser()
    {
        $roles = Role::orderBy('id', 'DESC')->get();
        return view('backend.module.user.create', compact('roles'));
    }
    public function storeUser(UserRequest $request)
    {
        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
 
        $user = User::create($input);
        foreach ($request->input('roles') as $key => $role) {
            $user->attachRole($role);
        }
        //str_debug($user);
        $user->save();
        return redirect()->route('indexUser')->with(['message' => 'Thêm mới dữ liệu thành công']);
    }
getEdit
 public function editUser($id)
    {
        $user = User::find($id);
        $roles = Role::orderBy('id', 'DESC')->get();
        $user_roles = [];
        foreach ($user->roles as $key => $role) {
            $user_roles[] = $role->id;
        }
        return view('backend.quantri.edit', compact('user','roles','user_roles'));
    }


postEdit
    public function updateUser(Request $request, $id)
    {
        $user = User::find($id);
        if (!empty($request->password)) {
            $user->password = bcrypt($request->password);
        }
        else {
            $user = array_except($user, array('password'));
        }

        $user->name           = $request->name;
        $user->intro           = $request->intro;
        $user->level          = $request->level;
        $user->status         = $request->status;
        $user->remember_token = $request->_token;
        DB::table('role_user')->where('user_id', $id)->delete();
        foreach ($request->input('roles') as $key => $role) {
            $user->attachRole($role);
        }
        $user->save();
        return redirect()->route('indexUser')->with(['message' => 'Cập nhập dữ liệu thành công']);
    }
Add.blade.php
<div class="form-group">
   <label class="col-form-label required">Vai trò</label>
   <select class="form-control" name="roles[]" id="roles" multiple="">
           @if(!empty($roles))
            @foreach($roles as $role)
          <option value="{{ $role->id }}">{{ $role->display_name }}</option>
             @endforeach
            @endif
        </select>

          @if($errors->has('roles'))
       <div class="error" style="color: red">
    <p>{{ $errors->first('roles') }}</p>
          </div>
     @endif
  </div>

Edit blade
     <div class="form-group">
            <label class="col-form-label required">Vai trò</label>
            <select class="form-control" name="roles[]" id="roles" multiple="">
              @if(!empty($roles))
              @foreach($roles as $role)
              <option value="{{ $role->id }}" @if(in_array($role->id, $user_roles))selected @endif>{{ $role->display_name }}</option>
              @endforeach
              @endif
              </select>
      </div>
List blade
        <td>
                  @if(!empty($item->roles))
                  @foreach($item->roles as $role)
                  @if($role->name == 'admin')
                  <span class="badge badge-danger">{!! $role->display_name !!}</span>

                  @elseif($role->name == 'mod')
                  <span class="badge badge-success">{!! $role->display_name !!}</span>
                  @else
                  <span class="badge badge-primary">{!! $role->display_name !!}</span>
                  @endif

                  @endforeach
                  @endif
         </td>
Giờ vào Route
Route::get(
'xoa-nguoi-dung/{id}', [
'as' => 'destroyUser',
'uses' => 'UserController@destroyUser',
'middleware'   =>['role:admin']])
->name('destroyUser')
nghĩa là chỉ có thằng admin là có quyền xóa user
Route::get(
'sua-nguoi-dung/{id}', [
'as' => 'editUser',
'uses' => 'UserController@editUser',
'middleware'   =>['role:admin|superadmin']])
->name('editUser')  
nghĩa là thằng admin và superadmin đc sửa user
bạn làm theo ý của bạn nhé đây chỉ là vd mình đưa ra



Phân quyền laravel sử dụng Entrust Phân quyền laravel sử dụng Entrust Xét bởi khánh Trên 18:35 Xếp hạng: 5

Không có nhận xét nào:

d

ads
xuânkhánh. Được tạo bởi Blogger.