如何通过Laravel 5.2中的登录角色保护路由?

时间:2018-03-07 06:34:56

标签: php laravel laravel-5.2 laravel-middleware

我正在使用laravel 5.2。我在用户登录时遇到问题,如果他们知道网址,他们可以打开 admin 页面。以下是我的导航栏菜单:

@if(Session::get('Mem_Username') == 'Guest')
<li>
<a href="{{ url ('Client') }}"><i class="fa fa-building fa-fw"></i> Client List</a>
</li>
@endif
@if(Session::get('Mem_Role') == '1')
<li>
<a href="{{ url ('Lead') }}"><i class="fa fa-th-list fa-fw"></i> Leads</a>
</li>
<li>
<a href="{{ url ('Client') }}"><i class="fa fa-building fa-fw"></i> Client List</a>
</li>
@elseif(Session::get('Mem_Role') == '2')
<li>
<a href="{{ url ('Lead') }}"><i class="fa fa-th-list fa-fw"></i> Leads</a>
</li>
@endif

我已经把它放在每个控制器中

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

顺便说一句,我正在使用Session更改Authenticate.php文件,如下所示:

public function handle($request, Closure $next, $guard = null)
    {
        if(Session::has('Mem_Username')){

        }
        else{
            return redirect()->guest('');
        }

        return $next($request);
    }

1 个答案:

答案 0 :(得分:1)

php artisan make :middleware AdminMiddleware

它将创建一个新的中间件:App/Http/Middleware打开中间件,放置代码:

public function handle($request, Closure $next)
{
    if(!auth->user()->isAdmin()){
        abort(404);
    }
    return next($request);
}

并在用户模型下确保您使用isAdmin()方法检查当前用户是否为admin。

注册中间件

现在我们已经创建了一个中间件,我们需要让应用程序知道中间件的存在。如果您希望在每个请求上运行中间件,请转到app / Http / kernel.php并添加中间件&#39; isAdmin&#39;到内核​​类$middleware property

protected $middleware = [
    ...
    \App\Http\Middleware\AdminMiddleware::class
];

如果您希望中间件在某些路由上触发,我们可以命名中间件并将其用作参考机制将其添加到某些路由。要命名中间件,仍然在app/Http/kernel.php中,将键控属性添加到$routeMiddleware数组。数组键是中间件的名称,而值应该是中间件的isAdmin

protected $routeMiddleware = [
    ...
    'isAdmin' => \App\Http\Middleware\AdminMiddleware::class,
    ...
];

然后,您可以使用此中间件保护您的路线。

Route:get('someurl', 'Controller')->middleware('isAdmin');