В промежуточном программном обеспечении laravel отсутствует идентификатор запроса параметра - PullRequest
0 голосов
/ 02 июля 2019

У меня есть контроллер Laravel с уничтожающим методом и промежуточное ПО с именем CheckRole.

public function destroy(Request $request, $id)
{
    // code to delete item
}

Я не могу использовать $ id в промежуточном ПО CheckRole.

class CheckRole
{
  public function handle($request, Closure $next)
  {

  }
}

И

$request->id and
$request->route('id')

также не работают с промежуточным программным обеспечением. Как это исправить?

Ответы [ 3 ]

0 голосов
/ 02 июля 2019

Нет реального безопасного способа сделать это, поскольку пользователь может просто изменить идентификатор в отправленной форме, если только вы не хотите, чтобы пользователи, которые могут войти в систему, были администратором. Если это правда, я бы использовал предложение @ nakov.

Если вы хотите иметь систему полного доступа с ролями и т. Д., Я бы предложил: https://github.com/spatie/laravel-permission

Хороший учебник можно найти здесь, но, пожалуйста, не меняйте ничего, что указано в пароле: https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission

0 голосов
/ 02 июля 2019

Получение параметров URL в Middleware

class CheckRole
{
  public function handle($request, Closure $next)
  {
    $id = $request->route()->parameter('id');
  }
}
0 голосов
/ 02 июля 2019

$id в функции уничтожения - это id ресурса, который вы хотите удалить, так что он никогда не будет идентифицированным идентификатором пользователя, лучшим вариантом для проверки роли может быть политика авторизации вместо промежуточного программного обеспечения.

Или получите аутентифицированный идентификатор пользователя, используя: auth()->id() или $request->user()->id

Вы также можете добавить метод в модель User и проверить, какнапример:

class User ...

public function isAdmin()
{
    return $this->role === 'admin';
}

В промежуточном программном обеспечении

$request->user()->isAdmin();

--- EDIT

Так что если вы используете resource, когда вы, например, определили свой маршрут:

Route::resource('user', 'UsersController');

Затем в вашем промежуточном программном обеспечении вы можете получить доступ к id пользователя следующим образом:

$request->user

Если ваш маршрут такой:

Route::delete('/users/{user}', 'UsersController@destroy');

Затем вы можете получить его, используя именованный параметр $request->user.Убедитесь, что все, что вы используете в своем маршруте в {}, это имя параметра, который вы используете для получения id из.

...