如何限制用户只能看到自己的个人资料

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');

});