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>
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
Xét bởi khánh
Trên
18:35
Xếp hạng:

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