如果 Auth::user()->id != user_id 使用中间件限制页面

Restrict page if Auth::user()->id != user_id using middleware

我使用中间件来限制非管理员访问管理页面,我可以通过使用策略来限制来自其他用户的 "patients" 列表的页面,但如果我使用策略。我必须在每个函数中重复代码 can() 方法。如果我使用中间件检查 url 中的 user_id == Auth::user()->id。我不需要重复这个,但是我如何从我的中间件中的 url 中获取 user_id?

路线

Route::get('/patients/{patient}', 'PatientController@edit')

我现在拥有的

患者政策

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

患者控制器

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');
    }

中间件应该有什么

用户中间件

/**
 * @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');
    }
}

有人知道如何检查路由中的 {patient} user_id == 已登录的 user()->id 吗?

由于您已将 Illuminate\Http\Request 对象注入中间件中的 handle 函数,因此从 url:

获取患者 ID 非常简单
/**
 * @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');
    }
}

谢谢@Leorent,

你的回答对我帮助很大,这就是它得到修复的方式

路线

Route::get('/patients/{patient}', 'PatientController@show')->middleware('user');

用户中间件

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');
        }
    }

再次感谢!