将页面限制为管理员 - Laravel

时间:2017-10-14 20:23:58

标签: php laravel

我正在学习如何将页面限制为管理员。在我的 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时,我仍然被路由到该页面,尽管我不是经理。我错过了什么?

2 个答案:

答案 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教程来解决此问题。

您必须根据您的用户类型使用不同的中间件来处理其权限