我有一个正在开发的网络应用程序。用户可以创建具有唯一 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'));
}
}
这很简单,但可以完成工作。