阻止特定角色的用户访问路由

时间:2019-10-02 08:13:56

标签: laravel laravel-5 routes laravel-authorization

我有2个角色,分别是adminuser。现在,登录时,管理员转到dashboard路由,而用户转到home。当用户登录并将URL更改为http://127.0.0.1:8000/dashboard时,它可以访问管理员面板,但我不希望这样。我该如何做到这一点?

PS。我是Laravel的新手

2 个答案:

答案 0 :(得分:0)

使用中间件来管理路由或在控制器内部 像这样:

type Writable<T> = {
    -readonly [P in keyof T]: T[P];
}

class HttpClient {
    private handler: any;

    readonly foo: any;

    get(): void {
      // ...
    }
}

 // Error: property 'handler' is missing in type 'Writable<HttpClient>'
 // but required in 'HttpClient'
const httpClient: HttpClient = {} as Writable<HttpClient>; 

Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor');

或像这样在控制器内部:

Route::middleware(['auth', 'admin'])->group(function (){

Route::get('dashboard', 'HomeController@index')->name('home.index');

});

或者您可以将this用作中间件角色。

答案 1 :(得分:0)

对此的良好实践是使用中间件。 为管理员和用户创建中间件(我只会为管理员创建中间件,对于用户,您可以类似地进行操作):

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class AdminMiddleware
{
    public function handle($request, Closure $next)
    {
        if(Auth::check()){
            // check auth user role (I don't know how you can implement this for yourself, this is just for me)
            if(Auth::user()->role->name == 'admin'){
                return $next($request);
            } else {
                return redirect()->route('admin.dashboard'); // for admins
            }
        }

        return redirect()->route('main'); // for users
    }
}

在$ routeMiddleware数组的“ app / Http / Kernel.php”中注册(添加到该数组的末尾)。

'Admin' => \App\Http\Middleware\AdminMiddleware::class,

现在,如果您正在“ routes / web.php”中使用所有请求(实际上我认为是这样),那么可以为管理员使用这样的路由:

// USER ROUTES
Route::get('/', 'FrontController@main')->name('main');

// ADMIN ROUTES
Route::group([
    'as' => 'admin.',
    'middleware' => [ 'Admin' ],
], function () {
    Route::get('dashboard', 'AdminController@dashboard');
});

通过“ php artisan config:cache”刷新缓存。 试试吧!