【问题标题】:Laravel Passport: Add Auth Guard to Passport Routes?Laravel Passport:将 Auth Guard 添加到 Passport 路由?
【发布时间】:2019-04-26 23:05:19
【问题描述】:

有没有办法用你自己的身份验证保护覆盖护照路由中间件?

在我的 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 表,所以我唯一想要实现的是通过指定警卫来更改护照路由中的默认身份验证:

 '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));
    });
}

我们将不胜感激一些指导以及一些代码 sn-p 以获得支持。

【问题讨论】:

    标签: laravel-5.6 laravel-passport


    【解决方案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]);
    
    }
    

    我还更新了开箱即用的 vue 组件的 url,方法是在前面添加一个基本 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

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2020-07-25
      • 2023-03-15
      • 2018-03-28
      • 2018-07-16
      • 2019-10-16
      • 2020-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多