在Route.php中进行授权和认证:Laravel 5.1

3

下面是一个路由,它检查用户是否已经通过身份验证,只有在这种情况下才允许他们访问该页面

<?php
Route::group([
    'middleware' => 'auth',
], function() {

    Route::get('/Categories-List', 'Skills\Category_Controller@index');
});

在我的auth()->user()中,有RoleID来检查用户是否为管理员或其他角色。我想检查RoleID是否为1,然后才允许他们访问该页面。

Laravel 5.1中可以同时设置授权和认证吗?

2个回答

8

好的,你需要创建AdminMiddleware并将其添加到路由中。

首先,打开你的User模型并添加额外的方法:

public function isAdmin() 
{
   return $this->RoleID == 1;
}

现在在控制台中运行:

php artisan make:middleware AdminMiddleware

打开你的AdminMiddleware.php并修改handle方法,使其看起来像这样:

if (!\Auth::user()->isAdmin()) {
    if ($request->ajax()) {
        return response('Admin account required.', 401);
    } else {
        return redirect('/'); // set here any url you need
    }
}

return $next($request);

现在打开app/Http/Kernel.php文件,并将以下内容添加到$routeMiddleware属性中:
'isAdmin' => \App\Http\Middleware\AdminMiddleware::class,

最后将其修改为您的路由。
'middleware' => 'auth',

转换为

'middleware' => ['auth', 'isAdmin'],

这里的顺序很重要,如果您更改此处的顺序,则在用户未登录时会遇到意外异常。

根据您的需求,如果您希望在此路由中进行其他重定向而不是在auth中,在这种情况下,您可能还想仅使用isAdmin中间件。在这种情况下,您需要合并authisAdmin的方法,并将其适应您的需求。


@Helper 当用户不是管理员时,是否会出现这种情况? 如果是这样,请您是否已为“/”网址定义了任何中间件? 您应该在“AdminMiddleware”中重定向到不使用“isAdmin”中间件的路由。 - Marcin Nabiałek
如果用户已登录但不是管理员,并且访问了由isAdmin保护的路由,则会被重定向到/,稍后又会被重定向到/ - 这就是为什么会出现这种情况。您应该在AdminMiddleware中使用新路由,例如restricted,并创建新路由restricted,在其中显示此页面仅限于管理员,或者您应该将其重定向到已登录用户的主URL。 - Marcin Nabiałek
http://stackoverflow.com/questions/34560621/call-to-undefined-method-illuminate-support-facades-validatorresolver - Pankaj

2
你需要做的是运行多个中间件 - 一个用于验证用户,另一个用于检查他的访问级别。
你需要在数组中定义中间件,如下所示:
<?php
Route::group([
    'middleware' => ['auth','isAdmin'],
], function() {

    Route::get('/Categories-List', 'Skills\Category_Controller@index');
});

你可以看到我添加了一个名为isAdmin的中间件,它将执行你需要的检查。你只需要自己创建这个中间件。
有关路由中间件的其他信息,请参见此处:http://laravel.com/docs/master/middleware#assigning-middleware-to-routes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接