如何通过在URL Laravel中输入ID来限制用户访问其他用户的页面



我有一个正在开发的网络应用程序。用户可以创建具有唯一 ID 的患者。 我遇到的问题是,当另一个用户登录时,他只需在 URL 中输入他们的 ID 即可轻松访问未分配给他的患者。请问我该如何解决这个问题?这是我的路线示例用户查看他的病人:

Route::get('patients/{patient}/view', 'PortalPatientController@viewPatient');

在患者控制器中:

public function viewPatient($patient){
    $patient = Patient::where('id', $patient)->first();
    return view ('portal.patient',compact('patient'));
}

请问我做错了什么?

您可以为此使用策略:

策略是围绕特定模型或资源组织授权逻辑的类。例如,如果您的应用程序是博客,则您可能有一个帖子模型和一个相应的 PostPolicy 来授权用户操作,例如创建或更新帖子。

或门:

门是确定用户是否有权执行给定操作的闭包

我会使用策略,但您也可以手动检查用户是否可以查看以下内容的页面:

if (auth()->id() !== $patient) {
    return redirect('/')->with('message', 'You can not view this page');
}
您也可以

保持GET访问此页面,而无需输入id。例如,如果只想从当前登录的用户获取患者:

网站.php

Route::get('patients/view', 'PortalPatientController@viewPatient');

患者控制器

public function viewPatient(){
    $id = auth()->id();
    $patient = Patient::where('id', $id)->first();
    return view ('portal.patient',compact('patient'));
}

请记住,这仅适用于经过身份验证的用户。

如果你的数据库表结构是这样的

Patients
--------
id //Unique ID of Patient
user_id //User that created
patient

然后你可以像这样签入控制器。

public function viewPatient($patient)
{
    $patient_check = Patient::where('id', $patient)->where('user_id','=',Auth::user()->id)->first();
    if($patient_check == null || count($patient_check) == 0)
    {
        return "You cannot view this patient";
    }
    else
    {
        return view ('portal.patient',compact('patient'));
    }
}

这很简单,但可以完成工作。

最新更新