Php 如何限制用户只查看自己的配置文件
我有一个视图(Php 如何限制用户只查看自己的配置文件,php,laravel,laravel-6,Php,Laravel,Laravel 6,我有一个视图(resources/view/front/auth/profile.blade.php),我在web.php中的路径是: Route::get('/profile/{user}','UserController@edit') ->name('profile') ->middleware('profilecheck'); 我的问题是,当用户登录并被重定向到他们自己的个人资料页面时(http://exmaple.com/profile/2),他可以将url
resources/view/front/auth/profile.blade.php
),我在web.php
中的路径是:
Route::get('/profile/{user}','UserController@edit')
->name('profile')
->middleware('profilecheck');
我的问题是,当用户登录并被重定向到他们自己的个人资料页面时(http://exmaple.com/profile/2
),他可以将url更改为http://exmaple.com/profile/3
并查看其他用户配置文件
我想使用一个中间件来检查url参数为{user}
的经过身份验证的用户id。$user->id
将传递给{user}
,但我不知道如何传递
谢谢你的帮助
中间件UserProfile.php
:
<?php
namespace App\Http\Middleware;
use App\User;
use Closure;
class UserProfile
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// $request->user()->id
// Auth::user()->id
return $next($request);
}
}
只需从url中删除用户id,而通过身份验证会话即可保护路由
因此,您的路线签名应该来自:
Route::get('/profile/{user}', 'UserController@edit')->name('profile');
为此:
Route::get('/profile', 'UserController@edit')->name('profile');
因此,在控制器中,不要从请求中获取用户id:
public function edit(Request $request)
{
$user = User::findOrFail($request->id);
// ...
}
您可以通过Auth
facade获得登录的用户
:
use Illuminate\Support\Facades\Auth;
public function edit(Request $request)
{
$user = Auth::user();
// ...
}
或者只是auth()
帮助程序:
public function edit(Request $request)
{
$user = auth()->user();
// ...
}
这样,您就屏蔽了url,以避免恶意用户做他/她不应该做的事情。您只需从url中删除用户id,然后通过身份验证会话来保护路由
因此,您的路线签名应该来自:
Route::get('/profile/{user}', 'UserController@edit')->name('profile');
为此:
Route::get('/profile', 'UserController@edit')->name('profile');
因此,在控制器中,不要从请求中获取用户id:
public function edit(Request $request)
{
$user = User::findOrFail($request->id);
// ...
}
您可以通过Auth
facade获得登录的用户
:
use Illuminate\Support\Facades\Auth;
public function edit(Request $request)
{
$user = Auth::user();
// ...
}
或者只是auth()
帮助程序:
public function edit(Request $request)
{
$user = auth()->user();
// ...
}
这样,您就屏蔽了url,以避免恶意用户做他/她不应该做的事情。您需要这样做
你的路线
Route::get('/profile', [
'uses' => 'UserController@profile',
'middleware' => 'profilecheck'
]);
您的中间件
class CheckUserMiddleware
{
public function handle($request, Closure $next)
{
if(!auth()->user()) {
return redirect()->route('login');
}
return $next($request);
}
}
你需要这样做
你的路线
Route::get('/profile', [
'uses' => 'UserController@profile',
'middleware' => 'profilecheck'
]);
您的中间件
class CheckUserMiddleware
{
public function handle($request, Closure $next)
{
if(!auth()->user()) {
return redirect()->route('login');
}
return $next($request);
}
}
如果已记录,只需使用“/profile”作为url,并在控制器中使用返回视图(…)->with('user',auth()->user())
,或定义一些策略删除在url中传递id的选项,只需使用控制器中的auth facade通过auth::user()访问用户即可返回当前文件user@Berto99非常感谢。我只是照你说的做了,它成功了。如果它被记录了,只需使用一个“/profile”作为url,在控制器中使用返回视图(…)->with('user',auth()->user())
,或者定义一些策略删除在url中传递id的选项,然后通过auth::user()访问用户在控制器中使用auth facade返回当前user@Berto99,谢谢你,我只是照你说的做了,它成功了。这是一种方法,但是你错过了一些东西,比如路由模型绑定。从长远来看,使用auth中间件和策略可能会更好run@Spholt为什么会错过模型绑定?如果需要绑定其他内容,只需在路由中定义它并在函数中接收它。我并不是说在每个请求中都应该这样做,只是在阻止用户修改其配置文件的特殊情况下。这种方法也适用于编辑与用户相关的内容。这是一种方法,但是你会错过一些东西,比如路由模型绑定。从长远来看,使用auth中间件和策略可能会更好run@Spholt为什么会错过模型绑定?如果需要绑定其他内容,只需在路由中定义它并在函数中接收它。我并不是说在每个请求中都应该这样做,只是在阻止用户修改其配置文件的特殊情况下。这种方法也适用于编辑与用户相关的内容。