如果 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');
}
}
再次感谢!
我使用中间件来限制非管理员访问管理页面,我可以通过使用策略来限制来自其他用户的 "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:
/**
* @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');
}
}
再次感谢!