我有一个多级成员网站,需要在Laravel 5.5中的web.php文件中保护我的路由。
我的用户表上有一个名为role_id
的列。
在role_id
中是以下值
我试图用简单的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....
但得到错误尝试获取非对象的属性。也许不是最好的方法。
所以我读到了像这样用MIDDLEWARE这样做:(看起来好多了)
Route::group(['middleware' => ['auth', 'admin']], function() {
// put all your admin routes here
});
Route::group(['middleware' => ['auth', 'owner']], function() {
// put all your owner user routes here
});
但它没有解释如何添加中间件。我是否必须为每个组创建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);
}
}
有人可以伸出援助之手并解释如何编写正确的中间件来实现这一目标吗?
像这个例子:
Route::get('/cart/payment', 'CartController@getcartpayment')->middleware('checkAuth');
$user = Sentinel::findById($user_id);
$role= $user->role();
错误尝试获取非对象的属性。如果用户尚未登录,则可以找到。
在你检查之前
if (Auth::user()->role_id != '2'):
你应该确保用户已登录
Auth::check()
第一...
web.php
Route::group(['middleware' => ['auth', 'admin']], function() {
Route::get('/admin/dashboard', function(){
return view('admin.dashboard');
});
});
进入受保护的$ routeMiddleware of Kernel.php
'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'));
}
admin,版主,所有者,banned_user将是user表的user_type / role列的值。或者你可以用user_type_id
或role_id
代替user_type_name
或role_type
别忘了添加
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response;
就在
use Closure;
你的中间件
您也可以使用Gate之类的其他方式,如果您需要,请告诉我。 :)