Laravel - Как гарантировать, что вошедший в систему пользователь может получить доступ только к данным своей компании - PullRequest
1 голос
/ 25 сентября 2019

Я разрабатываю клиентское портальное приложение, используя Angular-7 в качестве внешнего интерфейса и Laravel-5.8.Я использую Larave 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;

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

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

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

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

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

ApiController.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. The Logged-in пользователь должен иметь возможность просматривать только те поездки, которые совершает его компания.

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

Как я могу изменить свой код для достижения этой цели

1 Ответ

0 голосов
/ 25 сентября 2019

Я предполагаю, что пользователи, не прошедшие аутентификацию, не могут достичь этой конечной точки.Вам просто нужно создать начальный построитель запроса на поездку для всех случаев с условием начала где о 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);
...