Laravel Passport: добавить Auth Guard к паспортным маршрутам?
Есть ли способ переопределить промежуточное ПО для паспортного маршрута с помощью вашей собственной защиты?
В моем методе загрузки AuthServiceProvider я могу сделать следующее, но он просто объединяет промежуточное ПО со значениями по умолчанию ( https://github.com/laravel/passport/blob/master/src/Passport.php):
public function boot()
{
$this->registerPolicies();
Passport::routes(null, ['middleware' => 'auth:recruiters']);
}
Например, приведенное выше дает мне следующее промежуточное программное обеспечение, примененное к маршрутам:
GET|HEAD | oauth/authorize | | Laravel\Passport\Http\Controllers\AuthorizationController@authorize | auth:recruiters,web,auth
Я хочу полностью удалить auth
промежуточное программное обеспечение, где оно применяется к любым паспортным маршрутам и заменяется на auth:recruiter
или любой другой охранник.
В моем config / auth.php мои охранники настроены следующим образом. Обратите внимание, что провайдер - это таблица пользователей, поэтому единственное, что я хочу реализовать, - изменить значение по умолчанию для аутентификации в паспортных маршрутах, указав защитное устройство:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
'recruiter' => [
'driver' => 'session',
'provider' => 'users',
],
],
Нужно ли мне писать собственные паспортные маршруты для достижения этой цели, и если да, то я просто вставляю их в файл rout.php и удаляю Passport::routes()
из метода загрузки?
Какой вариант обратного вызова на Passport::routes()
метод, могу ли я использовать это, возможно, для переориентации существующих маршрутов?
public static function routes($callback = null, array $options = [])
{
$callback = $callback ?: function ($router) {
$router->all();
};
$defaultOptions = [
'prefix' => 'oauth',
'namespace' => '\Laravel\Passport\Http\Controllers',
];
$options = array_merge($defaultOptions, $options);
Route::group($options, function ($router) use ($callback) {
$callback(new RouteRegistrar($router));
});
}
Некоторые рекомендации будут оценены вместе с некоторыми фрагментами кода для поддержки.
1 ответ
Хорошо, так что мне удалось сделать что-то вроде взлома, чтобы применить мою собственную защиту от авторизации следующим образом.
В моем методе загрузки я переопределяю все паспортные маршруты, используя метод обратного вызова:
public function boot()
{
$guard = 'auth';
$prefix = 'oauth';
if ($this->app->request->is('recruiter/*')){
$guard = 'auth:recruiter';
$prefix = 'recruiter/oauth';
}
Passport::routes(function ($router) use ($guard) {
// forAuthorization
Route::group(['middleware' => ['web', $guard]], function ($router) {
$router->get('/authorize', [
'uses' => 'AuthorizationController@authorize',
]);
$router->post('/authorize', [
'uses' => 'ApproveAuthorizationController@approve',
]);
$router->delete('/authorize', [
'uses' => 'DenyAuthorizationController@deny',
]);
});
// all other routes...
}, ['prefix' => $prefix]);
}
Я также обновил URL-адреса для готовых компонентов vue следующим образом, добавив базовый URL-адрес - в моем случае базовый URL-адрес также определяет охрану для использования.
getClients() {
axios.get('/' + baseUrl + '/oauth/clients')
.then(response => {
this.clients = response.data;
});
},
Я сохраняю базовое значение URL в своем шаблоне основного макета внутри тега script, так как у меня есть свой шаблон макета для каждого типа пользователя, например:
<script>
var baseUrl = "recruiter";
</script>
Наконец, я изменил файл vendor / passport / authorize.blade.php, обновив URL-адреса утвержденных и отмененных форм следующим образом:
<form method="post" action="/{{ Request::segment(1) }}/oauth/authorize">
Теперь я могу продолжать использовать свои мультиавтоматические настройки.
Обратите внимание, что это работает, только если ваш поставщик мульти аутентификации все users