【问题标题】:Protecting Routes with Role Permissions using middleware Laravel使用中间件 Laravel 保护具有角色权限的路由
【发布时间】:2018-09-25 15:41:15
【问题描述】:

我有一个多级会员网站,需要在 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);        
    }
}

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

【问题讨论】:

  • 确保Auth::user() 不为空..
  • 它为空,我以管理员身份登录。这是为什么呢?
  • Trying to get property of non-object 表示您尝试在某处执行$foo->bar$foo 不是对象。
  • 抱歉@echo,我只是浏览了您的代码并注意到只有Auth::user()$this->auth->user() 可能返回空值。 @Scuzzy 是对的,也许你可以发布堆栈跟踪,这样我们就可以找到真正在抛出 Trying to get property of non-object 的人?

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


【解决方案1】:

web.php

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

进入受保护的 Kernel.php 的 $routeMiddleware

'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 将是 user 表的 user_type/role 列的值。 或者您可以使用user_type_idrole_id 代替user_type_namerole_type

别忘了添加

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

就在下面

use Closure; 

你的中间件

您也可以使用 Gate 等其他方式进行操作,如果您需要,请告诉我。 :)

【讨论】:

    【解决方案2】:

    像这个例子:

     Route::get('/cart/payment', 'CartController@getcartpayment')->middleware('checkAuth');
    
    
     $user = Sentinel::findById($user_id);
            $role= $user->role();
    

    【讨论】:

      【解决方案3】:

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

      在你检查之前

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

      你应该确保用户使用

      登录

      Auth::check()

      首先...

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 2017-05-15
        • 2015-12-17
        • 1970-01-01
        • 2021-11-12
        • 2015-08-12
        • 2021-09-28
        • 1970-01-01
        • 2014-07-18
        相关资源
        最近更新 更多