Laravel Passport:将Auth Guard添加到护照路线吗?

时间:2018-11-24 19:56:52

标签: laravel-5.6 laravel-passport

是否可以使用您自己的身份验证卫士来覆盖护照路径中间件?

在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文件中,我设置了如下的防护措施-请注意,提供者是users表,因此我要实现的唯一事情是通过指定防护措施来更改护照路线中的默认认证:< / p>

 'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],

    'recruiter' => [
        'driver' => 'session',
        'provider' => 'users',
    ],


],

我是否需要编写自己的护照路线才能实现此目的,如果要我将它们粘贴在routes.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 个答案:

答案 0 :(得分:0)

好,因此我设法进行了一些黑客操作,以应用我自己的身份验证防护,如下所示。

在我的启动方法中,我使用回调方法覆盖所有通行证路线:

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文件,如下所示:

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

现在我可以继续使用我的multiauth设置了。

请注意,仅当您的多身份验证提供者都是users

时,此方法才有效