【发布时间】:2018-05-15 15:14:15
【问题描述】:
我正在使用 Laravel 护照进行 API 身份验证,当我将它与一个数据库一起使用时它可以完美运行,但在使用多个数据库时会给出 401,
我在做什么:
- 我有一个多租户数据库,主数据库有用户、角色和所有 OAuth 表。
- 当我创建一个具有管理员角色的用户时,它将创建具有管理员名称的新数据库,它将创建具有用户、角色和所有 OAuth 表的子数据库。子数据库的
oauth_clients将从主数据库复制密码授予令牌和个人访问令牌并插入子数据库,并在oauth_personal_access_clients中插入client_id。 我正在执行
passport:install命令执行的所有程序。 (如果我没有遗漏什么)。当我使用主数据库中的凭据登录时,它运行良好,真正的问题是当我使用子数据库中的凭据登录时,我可以从参数
client_code获取子数据库,我使用email输入,password登录时。它允许我从子数据库登录,但我收到
401 Unauthenticated错误,登录时获取访问令牌,并且我在从Angular前面登录后的每个请求上传递带有Bearer的Authentication标头。不知道我在这里缺少什么。
DBConnection 中间件
DBConnection 中间件在登录后为每个请求设置连接,
public function handle($request, Closure $next)
{
if ( $request->method() != 'OPTIONS' ) {
$this->access_code = $request->header('access-code');
if ( $this->access_code != '' && $this->access_code != 'sa' ) {
app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_PREFIX.$this->access_code);
} else {
app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_DEFAULT);
}
}
return $next($request);
}
DBConnection 动态设置database.php 中的默认数据库,为此,我调用在Controller.php 上创建的setDB 方法
setDB Controller.php
public function setDB($database='') {
$config = app()->make('config');
$connections = $config->get('database.connections');
$default_connection = $connections[$config->get('database.default')];
$new_connection = $default_connection;
$new_connection['database'] = $database;
$config->set('database.connections.'.$database, $new_connection);
$config->set('database.default', $database);
}
是否可以将passport 与 2 个不同的数据库一起用于相同的代码?
Laravel 5.4
Passport 4.0
Angular 4.4 在前端
【问题讨论】:
-
你如何在数据库之间切换以及你的标题里面到底有什么?这听起来像是其中之一的问题。
-
@tprj29 我创建了一个设置数据库配置的中间件,我在路由参数中传递了一个数据库名称,我认为它没有问题,因为登录完美,但登录后出现问题,它开始给出 401 错误,在前面使用 Angular 4
-
这听起来确实像一个标题问题,因为标题
Authentication只有在登录后才需要。而且由于登录和获取不记名令牌可以根据您的需要完美运行。你能告诉我们你的标题Authentication有什么价值吗? -
@tprj29 授权与登录传递的相同
-
代码会有所帮助,因为如果没有 anny 代码片段,很难看出哪里出错了
标签: php laravel laravel-passport