Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用中间件Laravel保护具有角色权限的路由_Php_Laravel_Laravel 5_Middleware_Laravel Middleware - Fatal编程技术网

Php 使用中间件Laravel保护具有角色权限的路由

Php 使用中间件Laravel保护具有角色权限的路由,php,laravel,laravel-5,middleware,laravel-middleware,Php,Laravel,Laravel 5,Middleware,Laravel Middleware,我有一个多级成员网站,需要在Laravel 5.5的web.php文件中保护我的路由 我的用户表中有一列名为role\u id 在role\u id中是以下值 NULL(对于新用户) 1(适用于业主) 2(行政) 3(适用于主持人) 4(针对被禁止的用户) 我试图用一个简单的IF语句来实现它 if (Auth::user()->role_id != '2'): return view('home'); else: //ADMIN ROUTES Route::ge

我有一个多级成员网站,需要在Laravel 5.5的web.php文件中保护我的路由

我的用户表中有一列名为
role\u id

role\u id
中是以下值

  • NULL(对于新用户)
  • 1(适用于业主)
  • 2(行政)
  • 3(适用于主持人)
  • 4(针对被禁止的用户)
我试图用一个简单的IF语句来实现它

if (Auth::user()->role_id != '2'):
    return view('home');
    else:
//ADMIN ROUTES
    Route::get('/admin','AdminController@index')->name('admin');
endif;

if (Auth::user()->role_id != '1'):
    return view('home');
    else:
//OWNER ROUTES
    Route::get('/admin','OwnerController@index')->name('owner');
endif;
ETC....
但尝试获取非对象的属性时发生get错误。也可能不是最好的方法

所以我读到了关于用中间件这样做的文章:(看起来好多了)

但它没有解释如何添加中间件。 我是否需要为每个组创建5个不同的中间件文件,类似于我找到的文件:

use Illuminate\Contracts\Auth\Guard;

class Admin
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle($request, Closure $next)
    {
        if($this->auth->user()->role_id != '2') {
            return redirect()->view('home');
        }
        return $next($request);        
    }
}

有人能帮忙解释一下如何编写正确的中间件来实现这一点吗?

尝试获取非对象属性时出错。如果用户尚未登录,则可以找到

在你检查之前

if(Auth::user()->role\u id!=“2”):

u应确保用户已使用登录

Auth::check()

首先…

像这样的例子:

 Route::get('/cart/payment', 'CartController@getcartpayment')->middleware('checkAuth');


 $user = Sentinel::findById($user_id);
        $role= $user->role();
web.php

Route::group(['middleware' => ['auth', 'admin']], function() {
    Route::get('/admin/dashboard', function(){
        return view('admin.dashboard');
    });
});
放入Kernel.php的受保护$routeMiddle软件中

'admin'      => \App\Http\Middleware\AdminMiddleware::class,
AdminMiddleware.php

$user = Auth::user();
if($user->role == 'admin'){
    return $next($request);
} else
    // abort(403, 'Wrong Accept Header');
    return new Response(view('notauthorized')->with('role', 'admin'));

}
管理员、版主、所有者、被禁止的用户将是用户表的用户类型/角色列的值。 或者您可以使用
user\u type\u id
role\u id
而不是
user\u type\u name
role\u type

别忘了加上

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response;
就在下面

use Closure; 
你的中间件


您也可以使用其他方法,如Gate,如果需要,请告诉我。:)

确保
Auth::user()
不为null。它为null,并且我以管理员身份登录。这是为什么?
尝试获取非对象的属性
意味着您正在尝试执行
$foo->bar
$foo
不是对象。抱歉@echo,我只是浏览了一下您的代码,注意到只有
Auth::user()
$this->Auth->user()
可能返回空值@Scuzzy是对的,也许你可以发布stacktrace,这样我们就可以找到到底是谁在抛出
试图获取非对象的属性
use Closure;