Промежуточное программное обеспечение Laravel «обходит», когда я отправляю неверный токен, но когда он является действительным токеном, промежуточное программное обеспечение выполняется - PullRequest
0 голосов
/ 30 января 2019

все мои друзья, у меня есть вопрос.

Route::group([
    'middleware' => ['ensure.role:store', 'auth:api']
]

Для упрощения,

i have two roles : ADMIN and STORE

Я создал промежуточное программное обеспечение, которое будет проверять роль пользователя и, если роль пользователяправильно, то позволит пользователю получить доступ к маршруту.

Работает нормально.Я попытался использовать ADMIN Jwt Token для доступа к STORE-маршрутам, и по праву меня выгнали, и наоборот.

Но теперь, если я модифицирую токен, скажем, я добавляю строку в любую часть токена,и пытаюсь получить доступ к любому маршруту, на самом деле мне разрешено.

Я попробовал var_dump и распечатать что-то на соответствующем промежуточном программном обеспечении, и вот мое наблюдение.

1. If the token is VALID as one of the user role, then 
the var_dump is executed, (means the middleware is executed)
2. if the token is INVALID as in i add / modify the original
token, then the var_dump is not executed, and so are the 
others route middleware.

Мне интересно, что вызываетэто поведение и что может быть решением этой проблемы, поскольку мне нужно выдать 401 без проверки подлинности в любом случае с недействительным токеном.

Спасибо

1 Ответ

0 голосов
/ 30 января 2019

Я понял это.После серии тестирования и чтения я обнаружил, что после laravel 5.3 и выше конструктор вызывается до промежуточного программного обеспечения.И поскольку в моем конструкторе я использую пользовательский объект до того, как я буду аутентифицироваться промежуточным программным обеспечением, я столкнулся с ошибкой конструктора, потому что пользователь имеет значение null.

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

Звучит сложно использовать промежуточное ПО на основе замыканий в качестве альтернативного решения

Поэтому я использую обходной путь, чтобы сделать это.

Я создаю вспомогательную функцию, которая возвращает мне true, если есть пользовательский объект, или return abort (401);если пользовательского объекта нет, то добавьте эту одну строку ко всем конструкторам.

$this->checkAccess = EnsureRoleUtil::check('admin');

После этого я просто делаю свой следующий конструктор как обычно

public function __construct() {
    $this->checkAccess = EnsureRoleUtil::check('admin');

    $this->user = Auth::user();
    $this->categoryM = new CategoryManager($this->user);
}

Однако, чтобыотметил, что это не очень хорошая практика, это просто хак / обходной путь.

...