Laravel 为什么InitializeTenancyByDomain不适用于登录过程?

Laravel 为什么InitializeTenancyByDomain不适用于登录过程?,laravel,routes,middleware,multi-tenant,Laravel,Routes,Middleware,Multi Tenant,这是针对Laravel 8.x的,Jetstream/Livewire脚手架具有Stancl/Renancy。租户模型或会话设置的初始化工作不正常。要么是我做得不对,要么是天生的问题 整个软件包是按照Stencl/Renancy v3.x的说明构建的。我可以按照下面列出的代码查看dd(\App\User::all()) Route::middleware([ 'web', InitializeTenancyByDomain::class, Pre

这是针对Laravel 8.x的,Jetstream/Livewire脚手架具有Stancl/Renancy。租户模型或会话设置的初始化工作不正常。要么是我做得不对,要么是天生的问题

整个软件包是按照Stencl/Renancy v3.x的说明构建的。我可以按照下面列出的代码查看dd(\App\User::all())

Route::middleware([ 
        'web',
        InitializeTenancyByDomain::class,
        PreventAccessFromCentralDomains::class,     
])->group(function (){
    
Route::get('/', function () { 
   dd(\App\User::all()); //can see all users models in tenants table
   return view('welcomeTenant'); 
});

Route::get('/home', [
    'middleware'  => ['auth'],
    'uses' => '\App\Http\Controllers\HomeController@index'
])->name('home');
                
});
这意味着对我来说初始化NancyByDomain是正确的

当从租户的域(例如从rtbs.example.in)请求登录表单时,加密的会话/cookie信息不会存储在租户的会话表(即rtbs.sessions)中。发布登录表单时,它正在查找不存在users表的中心域(例如.in)中的用户,因此出现central.users表not Existence错误。结果我得到了419个错误。我暂时禁用了csrf令牌验证以识别此问题

这就是问题所在。为什么InitializeTenancyByDomain不适用于登录过程?我会不会有一个根本性的错误?有趣的是,dd(\App\User::all())如果出现在其他任何地方,如下图所示

Route::middleware([ 
        'web',
        InitializeTenancyByDomain::class,
        PreventAccessFromCentralDomains::class,     
])->group(function (){
    
dd(\App\User::all()); //central-domain.users does not exist error

Route::get('/', function () { 
    return view('welcomeTenant'); 
});

Route::get('/home', [
    'middleware'  => ['auth'],
    'uses' => '\App\Http\Controllers\HomeController@index'
])->name('home');
                
});

引发相同的sql异常,即central-domain.users表不存在。只有在Route::get(“/”)中出现时,我才能看到正确的模型。

该软件包非常有用,但它需要大量的工作才能将所有的部分排列起来并进行维护。您已经有了正确的中间件,包括“web”和两个租赁位,它们将启动会话并允许检查CSRF

我以前也遇到过类似的问题。对我来说,最大的原因是它没有找到正确的“中心”路径,因此没有正确初始化租约

确保您的tenancy.php配置文件显示的是正确的中心域。类似于:

'central_domains' => [
     'example.in' // No http:// here
 ],

我在为JetStream提供后端的Laravel Fortify上遇到了这个问题。只有当我将会话驱动程序从文件更改为数据库时,它才成为一个问题-尽管这对于我的部署来说是必要的

问题是Fortify在其控制器的构造函数方法中广泛使用依赖项注入。如中所述,由于Laravel请求的生命周期,当这些构造函数运行时,租约将不可用。这意味着它们将默认使用中心连接,并导致登录失败

因为我们无法更改Fortify使用构造函数的方式,所以解决方案是将中间件更改为全局的,并在初始化中间件中添加对中心域的检查:

将Stancl\Renancy\Middleware\InitializeTenancyDomain复制到App\Middleware\InitializeTenancyDomain更改:

public function handle($request, Closure $next)
{

    //Skip for central domains
    if(in_array($request->getHost(), config('tenancy.central_domains'), true)){
        return $next($request);
    }


    return $this->initializeTenancy(
        $request, $next, $request->getHost()
    );
}
App/Http/Kernel 使用App\Http\Middleware\InitializeTenancyByDomain

protected $middleware = [
    // ...
    InitializeTenancyByDomain::class,
];
Config/fortify

use Stancl\Tenancy\Middleware\PreventAccessFromCentralDomains;

'middleware' => [
    'web',
    PreventAccessFromCentralDomains::class,
],
路线/租户

Route::middleware([
        'web',
        PreventAccessFromCentralDomains::class,
    ])->group(function () {

        //Your Routes

    }

通过此解决方案,Fortify和Stancl租赁现在可以与分离良好的数据库、会话和登录一起工作。

您好,谢谢。中心域只不过是本地主机(正在组装中)。无处不在(通过遵循管道)默认的db连接是到central\u域的,而不是租户的域。它进行正确的查询和绑定,但查找错误的db。它查找的是central的表,而不是租户的表。奇怪的是,dd(\App\User::all())仅当租户的用户出现在路由::get中时,才会向其提供(“/”…如果它在外部,又是同一个问题。它是路由映射/绑定吗?我不认为它是路由绑定。它只是没有正确初始化租约,这通常指向一些配置或其他。很抱歉,我在这里帮不了你-我确实遇到过几十个这样的问题,而最常见的是上面提到的问题,它涉及到f不同的东西。随着V3中的完全重构,这成为了一系列新的东西,其中一些我们仍在努力追踪。另一个常见的事情是,确保在central和tenant之间没有任何重复的路由。即在web.php中与在tenant.php路由文件中创建不同的
/login
。嗨,我刚刚做了一个尝试使用loginController和authenticate方法进行手动登录。第一次,我可以看到租户会话表中存在用户id号的条目!显然,这些租户路由没有应用中间件。这使得laravel 8.x auth脚手架或多或少无用。整个租户部分需要手动ally应用于它们,或者限制仅用于验证中间件还有待观察。是的,我正在使用L8的旧脚手架,因为这是一个较旧的项目。除了进行更多的重构工作之外,不知道为什么需要在那里进行“升级”。最后我设法解决了这个问题!这是一个很长的修改列表!