当前,我有一个系统,其中有两个完全独立的实体Users
和Admins
,每个实体都有自己的表。
在admins
表中,有一个用于access_level
的字段,因为管理员自己可以看到和管理的内容具有不同的访问级别。例如,只有具有admin访问级别的管理员才能创建新管理员。
中间件似乎是最好的选择。
在我的管理模型中,我有以下方法:
/**
* 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错误。
这些角色在admin表中,因为将永远只有3个角色,它们将始终与admin相关联。