4

我对实时事件广播非常陌生,我有简单的 laravel-echo-server 设置并处理一切。我无法设置/定义针对其他身份验证的身份验证guard,它总是在检查中user/default guard定义的auth.php 我已经为每个保护私有通道设置了身份验证路由,routes/channel.php如下面的文档。

对于 auth guard 用户私人频道

Broadcast::channel('users.{id}', function ($user, $id) {
   Log::info(class_basename($user));
   return (int) $user->id === (int) $id;
});

对于 auth guard admin 私人频道

Broadcast::channel('admins.{id}', function ($admin, $id) {
   Log::info(class_basename($admin));
   return (int) $admin->id === (int) $id;
});

它适用于第一种情况的警卫user,但从未适用于第二种情况,即admin警卫。和

Log::info(class_basename($admin))总是返回User类。

那么,我们如何传递或定义它应该使用adminguard 而不是user. 在探索了内部之后,Illuminate\Broadcasting\Broadcasters\Broadcaster我发现下面是一行411

public function user($guard = null)
{
    return call_user_func($this->getUserResolver(), $guard);
}

所以,如果我们可以传递这个保护参数,它就可以解决这个目的。如果有人可以给我任何东西或授权方式来设置多重警卫,那将非常有帮助。使用Laravel 5.4, laravel-echo-server, Redis, Socket.IO

4

2 回答 2

0

就像在其他地方一样,只需在闭包中使用Request 外观

在你的情况下:

Broadcast::channel('admins.{id}', function ($user, int $id) {
   return Request::user('admin')->id === $id;
});

发送到闭包的参数不能由用户更改,它由 laravel 框架控制。(参见BroadcastManageand RedisBroadcaster,或其他实现Illumiante\Contracts\Broadcasting\Broadcaster

于 2018-04-02T09:30:13.600 回答
0

我终于让它与 2 个单独的登录屏幕和 2 个单独的用户和客户表一起工作。

首先,我关注了私人频道广播的 Laracasts 视频。该视频说将所有回声事件侦听器放在您的 bootstrap.js 中。这将适用于一个用户表。但是,对于 2 个单独的表用户,您需要将相关的回声事件侦听器放置在您的 2 个单独的 app.blade.php 布局文件中。对于一个用户和另一个客户。然而,听众应该位于底部。

window.Echo.private('App.User.' +     window.Laravel.user.id) .listen('Event', e => { etc. });

window.Laravel = {!! json_encode([ 'customer' => auth()->guard('customer')->user() ]) !!};

window.Echo.private('App.Customer.' + window.Laravel.customer.id) .listen('Event', e => { etc. });

然后在你的 routes/channels.php

Broadcast::channel('App.User.{id}', function ($user, $id)
return (int) $user->id === (int) $id;
});

Broadcast::channel('App.Customer.{id}', function ($user, $id)
return (int) auth()->guard('customer')->user()->id === (int) $id;
}); // Note I do not compare "$user" here

然后在 BroadcastServiceProvider.php

Broadcast::routes(['middleware' => 'web', 'auth:customer']);
require base_path('routes/channels.php');

//Remove Broadcast::routes();

客户可以收到私人消息,用户也可以。希望这可以帮助。

于 2020-01-23T09:55:13.857 回答