Как запретить пользователю видеть только свой профиль - PullRequest
0 голосов
/ 24 января 2020

У меня есть представление (resources/view/front/auth/profile.blade.php), и мой маршрут в web.php:

Route::get('/profile/{user}','UserController@edit')
    ->name('profile')
    ->middleware('profilecheck');

Моя проблема заключается в том, что когда пользователь входит в систему и перенаправляется на страницу своего профиля (* 1006) *), он может изменить URL-адрес на http://exmaple.com/profile/3 и просмотреть профиль других пользователей,

Я хочу использовать промежуточное ПО для проверки идентификатора аутентифицированных пользователей с помощью URL-параметра {user}. $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);

    }
}

Ответы [ 3 ]

5 голосов
/ 24 января 2020

Вы можете защитить маршрут, просто удалив идентификатор пользователя из URL-адреса, но вместо этого получив его через сеанс аутентификации.

Итак, ваша подпись маршрута должна начинаться с:

Route::get('/profile/{user}', 'UserController@edit')->name('profile');

На это:

Route::get('/profile', 'UserController@edit')->name('profile');

Итак, в вашем контроллере вместо получения идентификатора пользователя из запроса:

public function edit(Request $request)
{
     $user = User::findOrFail($request->id);
     // ...
}

Вы можете получить авторизованный User через Auth фасад:

use Illuminate\Support\Facades\Auth;

public function edit(Request $request)
{
     $user = Auth::user();
     // ...
}

или просто помощник auth():

public function edit(Request $request)
{
     $user = auth()->user();
     // ...
}

Таким образом, вы маскируете URL, чтобы избежать злоумышленника, который делает то, что он / она не должны.

0 голосов
/ 25 января 2020
// 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');

});
0 голосов
/ 24 января 2020

Вам нужно сделать что-то подобное.

Ваш маршрут

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);
  }
}
...