Laravel Middleware на основе отношения - PullRequest
0 голосов
/ 05 октября 2018

В моем приложении 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?

1 Ответ

0 голосов
/ 05 октября 2018

Аутентификация отличается от авторизации.Laravel поддерживает оба.

Вы можете делать то, что вам нужно, с помощью политик авторизации, нет необходимости в дополнительном промежуточном программном обеспечении.

Сначала создайте политику:

php artisan make:policy JobsPolicy --model=Job

Это будетсделай свой шаблонЗатем вы можете добавить действия:

class JobsPolicy {
    use HandlesAuthorization;

    //If you return true here the policy always succeeds
    public function before(User $user, $ability) { 
        if ($user->is_admin) {
            return true;
        }
    }


    public function view(User $user, Job $job) {
        return $user->jobs->contains($job);
    }

    public function create(User $user) {
        return true; //Return true if the user can create jobs
    }

    public function update(User $user, Job $job) {
          return $user->jobs->contains($job);
    }   
}

Вам также необходимо зарегистрировать свою политику в AuthServiceProvider в массиве $policies:

 protected $policies = [
    Job::class => JobPolicy::class        
];

Затем вы можете добавить ужесуществующее промежуточное программное обеспечение, например:

Routes::get('jobs/{job}/notes/{note}', ...)->middleware("can:view,job"); 

Это гарантирует, что текущий аутентифицированный пользователь can view job, указанный параметром задания маршрута.

Более подробная информация содержится в документации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...