如何限制用户只能看到自己的个人资料
How to restrict a user to only see their own profile
我有一个视图 (resources/view/front/auth/profile.blade.php
),我在文件 web.php 中的路线是:
Route::get('/profile/{user}','UserController@edit')
->name('profile')
->middleware('profilecheck');
我的问题是,当用户登录并被重定向到他们自己的个人资料页面 (http://exmaple.com/profile/2
) 时,he/she 可以将 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
门面获取登录User
:
use Illuminate\Support\Facades\Auth;
public function edit(Request $request)
{
$user = Auth::user();
// ...
}
或者只是 auth()
助手:
public function edit(Request $request)
{
$user = auth()->user();
// ...
}
这样,您就可以屏蔽 URL 以避免恶意用户做 he/she 不应该做的事情。
你需要做这样的事情。
你的路线
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);
}
}
// Controller
public function index()
{
if (Auth::check() && Auth::user()->role->id == 2) {
return view('author.setting.settings');
} else {
Toastr::info('you are not authorized to access', 'Info');
return redirect()->route('login');
}
}
// Route
Route::group(['as'=>'user.','prefix'=>'user','namespace'=>'Author','middleware'=>['auth','user']], function (){
Route::get('/setting','SettingsController@index')->name('settings.settings');
});
我有一个视图 (resources/view/front/auth/profile.blade.php
),我在文件 web.php 中的路线是:
Route::get('/profile/{user}','UserController@edit')
->name('profile')
->middleware('profilecheck');
我的问题是,当用户登录并被重定向到他们自己的个人资料页面 (http://exmaple.com/profile/2
) 时,he/she 可以将 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
门面获取登录User
:
use Illuminate\Support\Facades\Auth;
public function edit(Request $request)
{
$user = Auth::user();
// ...
}
或者只是 auth()
助手:
public function edit(Request $request)
{
$user = auth()->user();
// ...
}
这样,您就可以屏蔽 URL 以避免恶意用户做 he/she 不应该做的事情。
你需要做这样的事情。
你的路线
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);
}
}
// Controller
public function index()
{
if (Auth::check() && Auth::user()->role->id == 2) {
return view('author.setting.settings');
} else {
Toastr::info('you are not authorized to access', 'Info');
return redirect()->route('login');
}
}
// Route
Route::group(['as'=>'user.','prefix'=>'user','namespace'=>'Author','middleware'=>['auth','user']], function (){
Route::get('/setting','SettingsController@index')->name('settings.settings');
});