代码之家  ›  专栏  ›  技术社区  ›  adam78

Laravel Passport:是否向Passport Routes添加授权守卫?

  •  0
  • adam78  · 技术社区  · 7 年前

    在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 或任何其他警卫。

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

    我是否需要编写自己的passport路由来实现这一点?如果需要,我只需将它们粘贴到routes.php文件中并删除 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 回复  |  直到 7 年前
        1
  •  1
  •   adam78    7 年前

    在我的引导方法中,我使用回调方法覆盖了所有passport路由:

    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>
    

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

    注意:只有当多重身份验证提供程序都是 users

    推荐文章