Laravel Passport: добавить Auth Guard к паспортным маршрутам? - PullRequest
0 голосов
/ 24 ноября 2018

Есть ли способ переопределить промежуточное ПО для паспортного маршрута с вашим собственным средством проверки подлинности?

В моем методе загрузки 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',
    ],


],

Нужно ли мне писать собственные паспортные маршруты для достижения этой цели, и если это так, я просто добавляю их в маршруты.php файл и удалить Passport::routes() из метода загрузки?

Какая опция обратного вызова в методе Passport::routes(), могу ли я использовать это, возможно, для переопределения существующего маршрутаes?

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 Ответ

0 голосов
/ 26 ноября 2018

Хорошо, поэтому мне удалось сделать что-то вроде взлома, чтобы применить мою собственную защиту аутентификации следующим образом.

В моем методе загрузки я переопределяю все паспортные маршруты, используя метод обратного вызова:

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>
        var baseUrl = "recruiter";
</script>

В заключение я внес измененияфайл vendor / passport / authorize.blade.php, обновив URL-адреса утвержденных и отмененных форм следующим образом:

<form method="post" action="/{{ Request::segment(1) }}/oauth/authorize"> 

Теперь я могу продолжать использовать настройку многократного использования.

Обратите внимание на этоработает только в том случае, если ваш провайдер с несколькими серверами авторизации users

...