首页 > 解决方案 > 使用中间件获取管理员权限

问题描述

当我尝试编写管理规则以防止用户输入特定路线时,我收到此错误:此集合实例上不存在属性 [名称]。

用户模型

<?php

public function roles()
{
    return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
}

public function isAdmin()
{
    if ($this->roles->name == "Admin") {
        return true;
    }
    return false;
}

管理中间件

public function handle($request, Closure $next) 
{

   if (Auth::check()) {
       if (Auth::user()->isAdmin()) {
       return $next($request);
       }
    }
    return redirect('/');
 }

路由和控制器

Route::group(['middleware' => 'admin'], function () 
{ 
    Route::get('/home', 'HomeController@index')->name('home');
});

public function __construct()
{ 
    $this->middleware('admin');  
}

标签: phplaravelpermissionsadminmiddleware

解决方案


模型上的roles()关系是多对多的,因此调用$this->roles返回模型集合,而不是单个模型实例。如果要检查是否Admin是当前用户拥有的角色之一,请尝试以下操作:

public function isAdmin()
{
    if ($this->roles->pluck('name')->contains('Admin')) {
        return true;
    }
    return false;
}

pluck()方法从您的集合(在本例中为名称字段)中返回一个“列”数据作为新集合。该contains()方法在集合中搜索给定值,如果集合包含该值,则返回 true,否则返回 false。

https://laravel.com/docs/5.7/collections#available-methods


推荐阅读