根据用户属性限制用户的访问权限

时间:2018-04-08 11:25:49

标签: laravel php-7.2

我有用户表。这些users表具有company_id属性。

我有一些带有ID的通用页面,例如

https://www.test.com/customer_question/p/4701/c/40960

仅当登录用户具有特定的company_id时,才需要访问此URL。否则,其他人只需通过递增IDS即可访问链接

因此,在每个控制器(索引,存储,更新等)中,我必须检查这样的东西

$company_id = Auth::user()->company_id;
$verify_seller = DB::table('sellers')
    ->select('*')
    ->where('company_id', '=', $company_id)
    ->get();

if ($verify_seller->isEmpty())
    return "This product neither belongs to your seller account nor another seller's product";

我认为我可以通过将上面的代码放到每个客户的_construct函数来处理这个问题。

使用Laravel处理这种情况的最佳方法是什么?

Laravel 5.6版

1 个答案:

答案 0 :(得分:2)

双向。

  1. 中间件

    class CheckSeller
    {
         public function handle($request, Closure $next, $guard = null)
        {
              $company_id = Auth::user()->company_id;
              $verify_seller = DB::table('sellers')
              ->select('*')
              ->where('company_id', '=', $company_id)
              ->get();
              if ($verify_seller->isEmpty()) {
                    return redirect()->route('main')->withError('Not Allowed')
              }
    
              return $next($request);
        }
    }
    

    在Kernel.php中

    protected $routeMiddleware = [
         ....
         'check_seller' => \Illuminate\Auth\Middleware\CheckSeller::class,
    ]
    

    路线

    Route::middleware(['check_seller'])->group(function () {
         //any controller that need to use the check_seller middleware
    });
    

    或者如果您需要在每个控制器中执行,您可以这样做..

    class Example extends Controller {
          public function __construct()
          {
               $this->middleware('check_seller');
          }
    }
    


  2. 2.基础控制器

        class BaseController extends Controller {
              public function __construct()
              {
                   $company_id = Auth::user()->company_id;
                   $verify_seller = DB::table('sellers')
                   ->select('*')
                   ->where('company_id', '=', $company_id)
                   ->get();
                   if ($verify_seller->isEmpty()) {
                        return redirect()->route('main')->withError('Not Allowed')
                   }
              }
        }
    

    在子控制器中

        class SellerController extends BaseController {
              public function __construct()
              {
                   parent::__construct();
              }
        }