В настоящее время у меня есть система, в которой у меня есть две совершенно разные сущности Users
и Admins
каждая со своей таблицей.
В таблице admins
есть поле для access_level
, поскольку администраторы могут сами иметь разные уровни доступа с точки зрения того, что они могут видеть и управлять. Например, только администраторы с уровнем доступа администратора могут создавать новых администраторов.
Промежуточное программное обеспечение казалось лучшим выбором для этого.
В моей модели администратора у меня есть следующие методы:
/**
* Check whether this admin has full admin status
*
* @return void
*/
public function getIsAdminAttribute()
{
return $this->access_level == 'admin' ? true : false;
}
/**
* Check whether this user has Partial status
*
* @return void
*/
public function getIsFullAttribute()
{
return $this->access_level == 'full' ? true : false;
}
/**
* Check whether this user has Partial status
*
* @return void
*/
public function getIsPartialAttribute()
{
return $this->access_level == 'partial' ? true : false;
}
/**
* Check whether this admin has a particular role
*
* @param [type] $role
* @return void
*/
public function getHasRoleAttribute($role)
{
if($this->access_level == $role){
return true;
}
return false;
}
Так что теперь у меня есть доступ к аксессорам is_admin, is_partial, is_full
, чтобы проверить разрешение в данный момент авторизованного администратора. У меня также есть способ проверить, есть ли у администратора роль.
Мое промежуточное программное обеспечение, которое я назвал Role
, выглядит так:
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class Role
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $roles)
{
if (Auth::guard('admin')->user()) {
$user = Auth::guard('admin')->user();
if ($user->is_admin) {
return $next($request);
foreach($roles as $role){
// Check whether user has a given role
if($user->has_role($role)){
return $next($request);
}
}
}
}
return response('You do not have permission to perform this action', 401);
}
}
В routes/web.php
Затем я использую это так:
Route::get('/vacancies', 'JobPostController@index')->name('vacancies.index')->middleware('role:partial');
Но когда я назначаю себя частично, я получаю ошибку 401 при посещении маршрута.
Роли находятся в таблице администраторов, поскольку когда-либо будет только 3 роли, и они всегда будут привязаны к администраторам.