使用中间件Laravel保护具有角色权限的路由

时间:2018-04-16 00:37:03

标签: php laravel laravel-5 middleware laravel-middleware

我有一个多级会员网站,需要在Laravel 5.5的web.php文件中保护我的路线。

我的用户表上有一个名为role_id的列。

role_id中是以下值

  • NULL(适用于新用户)
  • 1(对于所有者)
  • 2(适用于管理员)
  • 3(适用于版主)
  • 4(禁止用户)

我试图用简单的IF语句

来做
if (Auth::user()->role_id != '2'):
    return view('home');
    else:
//ADMIN ROUTES
    Route::get('/admin','AdminController@index')->name('admin');
endif;

if (Auth::user()->role_id != '1'):
    return view('home');
    else:
//OWNER ROUTES
    Route::get('/admin','OwnerController@index')->name('owner');
endif;
ETC....
  

但是获取错误尝试获取非对象的属性。也许不是最好的方法。

所以我读到了这样做的MIDDLEWARE :(看起来好多了)

Route::group(['middleware' => ['auth', 'admin']], function() {
    // put all your admin routes here
});

Route::group(['middleware' => ['auth', 'owner']], function() {
    // put all your owner user routes here
});

但它没有解释如何添加中间件。 我是否必须为每个组创建5个不同的中间件文件,类似于我找到的文件:

use Illuminate\Contracts\Auth\Guard;

class Admin
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle($request, Closure $next)
    {
        if($this->auth->user()->role_id != '2') {
            return redirect()->view('home');
        }
        return $next($request);        
    }
}

有人能伸出援助之手并解释如何编写正确的中间件来实现这一目标吗?

3 个答案:

答案 0 :(得分:0)

错误尝试获取非对象的属性。如果用户尚未登录,则可以找到。

在你检查之前

if(Auth :: user() - > role_id!=' 2'):

你应该确保用户使用

登录

Auth :: check()

...第一

答案 1 :(得分:0)

就像这个例子:

// Setup the number of the concurrent operations
TransferManager.Configurations.ParallelOperations = 64;
// Setup the transfer context and track the upoload progress
SingleTransferContext context = new SingleTransferContext();
context.ProgressHandler = new Progress<TransferStatus>((progress) =>
{
    Console.WriteLine("Bytes uploaded: {0}", progress.BytesTransferred);
});
// Upload a local blob
var task = TransferManager.UploadAsync(
    sourcePath, destBlob, null, context, CancellationToken.None);
task.Wait();

答案 2 :(得分:0)

web.php
Route::group(['middleware' => ['auth', 'admin']], function() {
    Route::get('/admin/dashboard', function(){
        return view('admin.dashboard');
    });
});

into protected $routeMiddleware of Kernel.php
'admin'      => \App\Http\Middleware\AdminMiddleware::class,


AdminMiddleware.php
$user = Auth::user();
if($user->role == 'admin'){
    return $next($request);
} else
    // abort(403, 'Wrong Accept Header');
    return new Response(view('notauthorized')->with('role', 'admin'));

}

admin, moderators, owner, banned_user will be value of user_type/role column of user table.
or you can use user_type_id or role_id instead of user_type_name or role_type

别忘了添加

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Response;

位于

下方
use Closure; 

您的中间件

您也可以使用Gate之类的其他方式来做到这一点,如果需要,请告诉我。 :)