Ограничить страницу, если Auth :: user () -> id! = User_id с использованием промежуточного программного обеспечения - PullRequest
0 голосов
/ 31 марта 2020

Я использую промежуточное ПО, чтобы ограничить страницу администратора от не-администраторов, и я могу ограничить страницы списком "пациентов" от других пользователей, используя политику, но если я использую политику. Я должен повторить метод кода () в каждой функции. Если я использую промежуточное программное обеспечение, чтобы проверить, если user_id в URL == Auth :: user () -> id. Мне не нужно повторять это, но как мне получить user_id из URL в моем промежуточном программном обеспечении?

route

Route :: get ('/ пациентов / {пациент} ',' PatientController@edit ')

Что у меня сейчас

PatientPolicy

public function view(User $user, Patient $patient)
    {
        // does this patient belong to user
        return $user->id == $patient->user_id;
    }

PatientController

public function edit(Patient $patient)
    {
        // authenticate logged in user
        $user = auth()->user();

        // can the loged in user do this?(policy)
        if($user->can('update', $patient)){
            return view('patient.edit-patient', compact('patient', 'user'));
        }
        return view('403');
    }

что я должен иметь в промежуточном программном обеспечении

UserMiddleware

/**
 * @param $request
 * @param Closure $next
 * @return mixed
 */
public static function handle($request, Closure $next)
{
    if (Auth::check() && Auth::user()->id == User::patients()->user_id) {
        return $next($request);
    } else {
        return redirect()->route('login');
    }
}

Кто-нибудь знает, как проверить, является ли {пациент} в маршрутах user_id == вошедшим в систему пользователем () -> id?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Поскольку у вас есть объект Illuminate\Http\Request, введенный в функцию handle в промежуточном программном обеспечении, довольно просто получить идентификатор пациента из URL:

/**
 * @param $request
 * @param Closure $next
 * @return mixed
 */
public static function handle($request, Closure $next)
{
    $patientId = $request->patient; // patient id from url!

    $patient = Patient::find($patientId);

    if (!$patient) {
        return redirect()->back()->with(['message' => 'Patient not found!']);
    }

    if (Auth::check() && (int) Auth::user()->id === (int) $patient->id) {
        return $next($request);
    } else {
        return redirect()->route('login');
    }
}
0 голосов
/ 31 марта 2020

Спасибо @ Leorent,

Ваш ответ мне очень помог, и вот как это исправлено

Маршрут

Маршрут :: получить ( '/ пациентов / {пациент}', 'PatientController@show') -> промежуточное ПО ('пользователь');

UserMiddeware

public static function handle($request, Closure $next)
    {
        $patientId = $request->patient->user_id; // user_id from patient in url!

        if (Auth::check() && (int) Auth::user()->id == $patientId) {
            return $next($request);
        } else {
            return redirect()->route('403');
        }
    }

Еще раз спасибо!

...