Laravel - Как убедиться, что вошедший в систему пользователь может получить доступ только к данным своей компании

Я разрабатываю приложение клиентского портала, используя Angular-7 в качестве интерфейса и Laravel-5.8. Я использую Lave Spatie для управления пользователями. У меня есть эти три таблицы:

CREATE TABLE `company` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `company_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `company_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `trips` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `dispatch_datetime` datetime DEFAULT NULL,
  `loading_date` date DEFAULT NULL,
  `loaded_from` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `destination` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `company_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `users` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `company_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Из приведенных выше таблиц у меня есть три класса: User, Company и Trip.

  1. Каждый пользователь принадлежит компании, но не более того.

  2. Каждая компания совершает несколько рейсов.

  3. company_id в компании также является первичным ключом.

Из ApiController я использовал Laravel Spatie, чтобы пользователи могли иметь доступ только к тем данным, которым им предоставлено разрешение. Это работает отлично:

Апиконтроллер.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Trip;
use App\User;
use App\Company;

use Illuminate\Support\Facades\Auth;

class TripController extends Controller
{
    public function index(Request $request){
        if(!Auth::user()->hasPermissionTo('View Trip')){
            return response()->json([ "message" => 'User do not have permission'], 401);
        }
        if(($request->get('sort')!='null' && $request->get('sort')!='') && $request->get('search')){
            $trip = Trip::where("trip_number", "LIKE", "%{$request->get('search')}%")->orderby($request->get('sort'), $request->get('order'))->paginate(10);
        } else if(($request->get('sort')!='null' && $request->get('sort')!='')){
            $trip = Trip::orderby($request->get('sort'), $request->get('order'))->paginate(10);
        }
        else if($request->get('search'))
            $trip = Trip::where("trip_number", "LIKE", "%{$request->get('search')}%")->paginate(10);
        else
            $trip = Trip::paginate(10);
        return response()->json($trip, 200);
    }
}

Теперь я хочу добиться следующего из приведенного выше кода:

  1. Вошедший в систему пользователь должен иметь возможность просматривать только поездки, которые осуществляет его компания.

  2. Если вошедший в систему пользователь принадлежит к компании, у которой company_id имеет значение MBB, он должен иметь возможность просматривать все поездки для всех компаний в базе данных, за исключением того, что у него нет разрешения на просмотр поездок. .

Как я могу изменить свой код, чтобы добиться этого?


person ayobamilaye    schedule 25.09.2019    source источник


Ответы (1)


Я предполагаю, что пользователи, не прошедшие проверку подлинности, не могут получить доступ к этой конечной точке. Вам просто нужно создать построитель начальных запросов на поездку для всех случаев с начальным условием where о company_id. Таким образом, вы можете добавить другие условия в этот начальный конструктор запросов на поездку.

$user = Auth::user();
if(!$user->hasPermissionTo('View Trip')){
    return response()->json([ "message" => 'User do not have permission'], 401);
}

$trip = Trip::where('company_id', $user->company_id);
if(($request->get('sort')!='null' && $request->get('sort')!='') && $request->get('search')){
    $trip = $trip->where("trip_number", "LIKE", "%{$request->get('search')}%")->orderby($request->get('sort'), $request->get('order'));
} else if(($request->get('sort')!='null' && $request->get('sort')!='')){
    $trip = $trip->orderby($request->get('sort'), $request->get('order'));
} else if($request->get('search')) {
    $trip = $trip->where("trip_number", "LIKE", "%{$request->get('search')}%");
}

return response()->json($trip->paginate(10), 200);
person Hakan SONMEZ    schedule 25.09.2019