Laravel - 如何确保登录用户只能访问他公司的数据
Laravel - How to ensure that logged in user can only access his company data
我正在使用 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;
从上面的表格中,我有三个 类:用户、公司和旅行。
每个用户都属于一家公司,但不能超过一家。
每家公司都会进行多次旅行。
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);
}
}
现在,我想通过上面的代码实现以下目的:
已登录用户应该只能查看其公司开展的旅行。
如果登录用户属于 company_id 作为 MBB 的公司,他应该能够查看所有行程数据库中的所有公司,除了他没有查看行程的权限。
如何修改我的代码来实现此目的?
我假设未经身份验证的用户无法访问此端点。您只需要为所有起始条件为 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);
我正在使用 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;
从上面的表格中,我有三个 类:用户、公司和旅行。
每个用户都属于一家公司,但不能超过一家。
每家公司都会进行多次旅行。
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);
}
}
现在,我想通过上面的代码实现以下目的:
已登录用户应该只能查看其公司开展的旅行。
如果登录用户属于 company_id 作为 MBB 的公司,他应该能够查看所有行程数据库中的所有公司,除了他没有查看行程的权限。
如何修改我的代码来实现此目的?
我假设未经身份验证的用户无法访问此端点。您只需要为所有起始条件为 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);