Применять промежуточное программное обеспечение, когда шаблон URL совпадает в Laravel - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь добавить в свой проект промежуточное программное обеспечение, которое проверяет, имеет ли пользователь доступ к проекту. Мой подход:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;


class UserProjectFit
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if ($request->is('*/projects/*')) {

            $projectUserId = DB::table('project_user')
                ->where('project_id', '=', $request->project['id'])
                ->where('user_id', '=', Auth::user()->id)
                ->first();

            if (is_null($projectUserId)) {
                abort(404);
            }

        }

        return $next($request);
    }
}

Это в основном работает, но у меня есть и маршруты, такие как e. г. projects/create и здесь тоже включается промежуточное ПО. Идея заключалась бы в том, что промежуточное ПО предпринимает действия только в том случае, если URL содержит строку project и идентификатор, e. г. …projects/1/…

Что было бы хорошим способом решить это? Если мой подход не очень хороший, я буду рад прочитать ваши предложения.

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Я просто следовал простому подходу, чтобы прикрепить маршрут к каждому нужному маршруту.Детали:

Маршрут:

Route::get('projects/{project}', 'ProjectsController@showProjectDashboard')->name('show-project-dashboard')->middleware('UserProjectFit');


Промежуточное ПО:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;


class UserProjectFit
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $projectUserId = DB::table('project_user')
            ->where('project_id', '=', $request->project['id'])
            ->where('user_id', '=', Auth::user()->id)
            ->first();

        if (is_null($projectUserId)) {
            abort(404);
        }

        return $next($request);
    }
}

Kernel.php

protected $routeMiddleware = [
    ...
    'UserProjectFit' => \App\Http\Middleware\UserProjectFit::class
];
0 голосов
/ 12 марта 2019

Вы можете использовать аутентификационные ворота и связать их с идентификатором роли. Это можно сделать в Authserviceprovider.

Примерно так

    Gate::define('projects_create_access', function ($user) {
        return in_array($user->role_id, [1]);
    });
...