代码之家  ›  专栏  ›  技术社区  ›  Bastin Robin

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

  •  0
  • Bastin Robin  · 技术社区  · 6 年前

    我必须使用laravel构建一个多租户应用程序,并添加一个子域中间件来根据请求更改数据库。我已经换了 SESSION_DOMAIN='.example.com' 并将会话驱动程序更改为数据库。我的应用程序完全在本地主机上工作 tenant.localhost:8000/login http:\\tenant.example.com/login 当我登录时,它会给我以下错误。 enter image description here

    我的 enter image description here

    2 回复  |  直到 6 年前
        1
  •  0
  •   Namoshek    6 年前

    最有可能的问题是 localhost 本地但是 .runnerhit.com 在生产中。区别是前导点 . 这对于路由组定义中的路由组是多余的。

        2
  •  0
  •   shadmehr79 ShuBham GuPta    5 年前

    假设您的路线是:

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

    使用route('home.index')而不是url('/')

        3
  •  0
  •   fylzero    5 年前

    我对多数据库多租户的处理方法如下。。。

    .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 在配置中,您可以在应用程序的其他地方访问该常量。例如,在一个blade文件中,如果你想让你的应用程序的navbar logo区域显示你可以使用的客户端名称。。。

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

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