Laravel基于子域的身份验证在生产中不起作用

时间:2019-01-31 03:31:30

标签: laravel session authentication subdomain laravel-5.7

我必须使用laravel构建一个多租户应用程序,并添加了一个子域中间件来根据请求更改数据库。我更改了SESSION_DOMAIN='.example.com',并将会话驱动程序也更改为数据库。通过重定向到仪表板,我的应用程序可以在localhost tenant.localhost:8000/login中正常运行。但是在我登录的实时服务器http:\\tenant.example.com/login中,它会显示以下错误。 enter image description here

我的 web.php enter image description here

3 个答案:

答案 0 :(得分:0)

问题很可能是您在本地使用localhost,但在生产中使用.runnerhit.com。区别在于前导点.对您的路由组定义中的那个是多余的。

答案 1 :(得分:0)

我也遭受这种情况的困扰。 plesae确保您在代码中使用路由名称而不是url 假设您的路线是:

Route::get('/','HomeController@index')->name('home.index');

使用route('homa.index')代替url('/')

答案 2 :(得分:0)

我对多数据库多租户的处理方式看起来像这样...

.env文件中,我添加了数据库。

# Database: Client 1
CLIENT_ONE_DB_CONNECTION=mysql
CLIENT_ONE_DB_HOST=127.0.0.1
CLIENT_ONE_DB_PORT=3306
CLIENT_ONE_DB_DATABASE=client_one_db
CLIENT_ONE_DB_USERNAME=root
CLIENT_ONE_DB_PASSWORD=

# Database: Client 2
CLIENT_TWO_DB_CONNECTION=mysql
CLIENT_TWO_DB_HOST=127.0.0.1
CLIENT_TWO_DB_PORT=3306
CLIENT_TWO_DB_DATABASE=client_two_db
CLIENT_TWO_DB_USERNAME=root
CLIENT_TWO_DB_PASSWORD=

config/database.php文件中,添加数据库。

'client_one' => [
    'driver' => 'mysql',
    'url' => env('CLIENT_ONE_DATABASE_URL'),
    'host' => env('CLIENT_ONE_DB_HOST', '127.0.0.1'),
    'port' => env('CLIENT_ONE_DB_PORT', '3306'),
    'database' => env('CLIENT_ONE_DB_DATABASE', 'forge'),
    'username' => env('CLIENT_ONE_DB_USERNAME', 'forge'),
    'password' => env('CLIENT_ONE_DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

'client_two' => [
    'driver' => 'mysql',
    'url' => env('CLIENT_TWO_DATABASE_URL'),
    'host' => env('CLIENT_TWO_DB_HOST', '127.0.0.1'),
    'port' => env('CLIENT_TWO_DB_PORT', '3306'),
    'database' => env('CLIENT_TWO_DB_DATABASE', 'forge'),
    'username' => env('CLIENT_TWO_DB_USERNAME', 'forge'),
    'password' => env('CLIENT_TWO_DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
        PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

我创建了一个用于在/config/connection.php处设置连接的配置文件,如下所示...

<?php

$domain = request()->getHttpHost();
$domain_parts = explode('.', $domain);
$subdomain = $domain_parts[0];

if ($subdomain == 'clientone') {
    config()->set('database.default', 'client_one');
}

if ($subdomain == 'clienttwo') {
    config()->set('database.default', 'client_two');
}

return ['subdomain' => $subdomain];

就是这样。我不必弄乱路由或中间件,它们都面临着更深层次的挑战。这种方法使所有事情变得简单而独立。

此外,通过在配置中返回subdomain,您将可以在应用程序的其他位置访问该常量。因此,例如,在刀片文件中,如果要让应用程序的导航栏徽标区域显示客户端名称,则可以使用...

{{ config('connection.subdomain') }}

这是我经过大量研究后选择做的。希望这种方法可以帮助其他人做我尝试做的事情。