В моем приложении Laravel администраторы могут назначаться на задания, у меня также есть супер-администраторы, которые могут делать все.
Администраторы, которые не являются супер-администраторами, должны иметь доступ только к тем заданиям, которым они назначены.
Давайте используем грубый маршрут для иллюстрации:
http://localhost:3000/jobs/{job}
http://localhost:3000/jobs/{job}/notes{note}
В этом сценарии {job}
- это идентификатор, полученный с помощью модели маршрутапривязка и примечание прикреплены к заданию.
Администраторы, назначенные заданиям, выполняются с помощью следующего метода отношений:
/**
* Get the jobs that this admin has access to via the pivot table
*
* @return void
*/
public function jobs()
{
return $this->belongsToMany(JobPost::class, 'job_post_admin', 'admin_id', 'job_post_id');
}
Так что я могу использовать $user->jobs
Я хочу иметь возможность сказать следующее - если вы супер администратор, вы можете пойти куда угодно, если нет, вы должны быть ограничены тем, что вам было назначено.
Так что еслипользователь имеет доступ только к http://localhost:3000/jobs/{1}
, и они переходят к http://localhost:3000/jobs/{2}
, они должны быть перенаправлены.
Я создал Middleware под названием Access
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::guard('admin')->user()) {
$user = Auth::guard('admin')->user();
if ($user->is_admin) {
return $next($request);
} else {
if ($user->jobs->contains($job)) {
return $next($request);
} else {
return response('You do not have sufficient priveledges to perform this action.', 403);
}
}
} else {
return redirect()->back();
}
}
Однако я запутался в том, чтокак я могу получить идентификатор задания из URL.
У меня есть работающее MiddleWare, которое выглядит следующим образом:
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class Access
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::guard('admin')->user()) {
$user = Auth::guard('admin')->user();
$job = $request->vacancy;
if ($user->is_admin) {
return $next($request);
} else {
if ($user->jobs->contains($job)) {
return $next($request);
} else {
return response('You do not have sufficient priveledges to perform this action.', 403);
}
}
} else {
return redirect()->back();
}
}
}
Мне сейчас интересно, хотя, поскольку звучание не плотное, я на самом деле не признал авторизацию в Laravel, имеет ли она преимущества по сравнению с Middleware?