我正在学习如何将页面限制为管理员。在我的 RedirectIfAuthenticated.php 中,这就是我的代码的样子
public function handle($request, Closure $next, $guard = null)
{
if (!Auth::guard($guard)->check()) {
// return redirect('/login');
} else {
$user = Auth::user();
if($user->hasRole('manager')) {
return redirect('admin/home');
} else {
return redirect('/home');
}
}
return $next($request);
}
登录后,我被路由到相应的页面,但问题是,即使我作为会员而非经理登录,我仍然可以路由到管理页面。当我放置localhost/admin/home
时,我仍然被路由到该页面,尽管我不是经理。我错过了什么?
答案 0 :(得分:1)
您可以在登录后访问管理员网址,因为您的代码只会将每个用户重定向到相应的网址,但在用户登录后不会进行任何其他检查。您可以通过以下方式完成此操作:创建一个中间件来检查每个用户类型并将它们重定向到适当的页面,并将此中间件附加到您想要的路由。
在您的终端中,运行php artisan make:middleware AdminMiddleware
以创建middleware
注意:AdminMiddleware
是我选择的名称,可以更改。
这会在middleware
目录中创建app\Middlewares
。编辑内容看起来像这样..
<?php
namespace App\Http\Middleware;
use Closure;
class AdminMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = Auth::user();
if(!$user->hasRole('manager'))
{
//you can throw a 401 unauthorized error here instead of redirecting back
return redirect()->back(); //this redirects all non-admins back to their previous url's
}
return $next($request);
}
}
然后转到app/Http/Kernel.php
文件并将以下内容添加到$routeMiddleware
数组中。
'admin' => \App\Http\Middleware\AdminMiddleware::class,
现在,您可以将admin
中间件附加到您希望managers
无法访问的任何路由。
答案 1 :(得分:0)
我建议您查看https://www.learn2torials.com/a/laravel-authentication-based-on-roles教程来解决此问题。
您必须根据您的用户类型使用不同的中间件来处理其权限