首页 > 解决方案 > 使用 Laravel Passport 仅在少数路由上访问自己的帐户

问题描述

我的整个应用程序有很多 api 路由为我的前端提供 ajax 响应。我使用 Laravel Passport xsrf 令牌保护来保护我的路由并管理身份验证。但是,我们计划提供一个特定类型的用户可以使用的 api。更详细地说,这是我们想要实现的(虚构)示例:

一家公司可以有很多职位空缺。我的 api 路由很多,现在我想让公司所有者能够通过我们的 sdk 获取他所有的空缺并将它们放在他的网站上。我面临的问题:据我正确理解护照,个人访问令牌是我需要的东西。我不想要“使用我的应用程序登录”功能(jet),我该如何禁用它?我只希望用户访问他自己的信息,而不是其他用户。而且我可能希望将来让用户注册不同的api。这样他就可以为不同的路由拥有多个访问令牌,但是这些路由都在一个 api.php 路由文件中。我想我需要为此使用范围,但是我如何安全地将范围分配给令牌,因为这只执行单个路由?

有人可以帮助我正确理解护照的概念吗?

标签: phplaravelapilaravel-passportapi-authorization

解决方案


我不使用护照,但似乎这个问题可以通过范围解决(不需要绑定到访问令牌)。如果您正在努力获取经过身份验证的用户,您可以关注这篇文章: 使用 Laravel Passport 获取经过身份验证的用户并授予密码

如果您正在为如何编写范围而苦苦挣扎,这就是我的想法

  • 您有一个包含名为的公司的表companies
  • 您有一个包含员工的表,称为employees
  • 您有一个包含空缺的表格,名为vacancies
  • 您有一个名为的连接表company_employee

现在您可以在Vacancy模型上创建范围

class User {
    public function companies()
    {
        return $this->hasMany(App\CompanyEmployee::class)
    }
}

class Employee {

}

class Company {

}

class CompanyEmployee {

}

class Vacancy {
    public function scopeMine($query)
    {
        $my_companies = auth()
            ->user()
            ->companies()
            ->select('company_id')
            ->pluck('company_id')
            ->get()
            ->toArray();

        return $query->whereIn('company_id', $my_companies);
    }
}

然后,无论您如何查询空缺(通过 API 或前端 GUI),您都可以简单地将范围添加到您的查询中,大概是在您的控制器中。

class VacancyController {
    public function index()
    {
        return App\Vacancy::mine()->get();
    }
}

推荐阅读