我具有以下为我的应用admins
,designers
,customers
等定义的身份验证防护。默认防护是designer guard
。
我希望每个guard
都有自己的private channel
。
因此,我在channel.php中定义了它,每个条目都有多个条目,如下所示:
Broadcast::channel('private.admins.{id}', function ($admin, $id) {
Log::info($admin);
//logging the admin
});
但这始终是binding
类的default guard
,所以我的问题是如何告诉我在Admin model
中使用它。
我在任何地方都找不到。那么你能指出我正确的方向吗?
实际上,我希望每个guard
都有自己的private channel
。
答案 0 :(得分:4)
尝试在BroadcastServiceProvider
文件app\Providers\BroadcastServiceProvider.php
中进行更改
每个警卫的广播授权端点不同
public function boot()
{
//Broadcast::routes();
//match any of the 3 auth guards
Broadcast::routes(['middleware' => ['web','auth:admins,designers,customers']]);
require base_path('routes/channels.php');
}
现在在channels.php中
Broadcast::channel('admins.channel.{id}', function ($admin, $id) {
return $admin->id === $id && get_class($admin) === 'App\Admin';
});
Broadcast::channel('designers.channel.{id}', function ($designer, $id) {
return $designer->id === $id && get_class($designer) === 'App\Designer';
});
Broadcast::channel('customers.channel.{id}', function ($customer, $id) {
return $customer->id === $id && get_class($customer) === 'App\Customer';
});
答案 1 :(得分:1)
我正在发布此答案,对于可能每天都遇到问题的每个人。我正在使用laravel 7和beyondcode/laravel-websockets
。当我在源代码中进行挖掘时,在BoradcastServiceProvider.php中指定中间件将不起作用。定义通道防护的唯一方法是通过指定通道选项:
Broadcast::channel('messaging.organ.{id}', function ($organ , $id) {
return $organ->id == $id && get_class($organ) === "App\Organization";
} , ['guards' => ['organ']]);
原因:
因为我正在使用beyondcode/laravel-websockets
,所以我在src/Illuminate/Broadcasting/Broadcasters/PusherBroadcaster.php
中进行挖掘,并且在此文件中,retrieveUser
方法将吸引用户。在此文件中,如果提供了通道选项,将返回指定防护中的用户。您可以定义一个或多个防护,但是它只会返回以阵列中第一位防护方式登录的一个用户。
protected function retrieveUser($request, $channel)
{
$options = $this->retrieveChannelOptions($channel);
$guards = $options['guards'] ?? null;
if (is_null($guards)) {
return $request->user();
}
foreach (Arr::wrap($guards) as $guard) {
if ($user = $request->user($guard)) {
return $user;
}
}
}