我对实时事件广播很新,我有简单的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
类。
那么,我们如何传递或定义它应该使用admin
后卫而不是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
答案 0 :(得分:0)
就像在其他地方一样,只需在闭包中使用Request
facade。
在你的情况下:
Broadcast::channel('admins.{id}', function ($user, int $id) {
return Request::user('admin')->id === $id;
});
发送给闭包的参数不能由用户更改,它由laravel框架控制。
(请参阅BroadcastManage
和RedisBroadcaster
,或Illumiante\Contracts\Broadcasting\Broadcaster
)的其他实现
答案 1 :(得分:0)
我最终使它可以与2个单独的登录屏幕和2个单独的user和customers表一起使用。
首先,我在私人频道播放了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. });
然后在您的route / 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();
客户可以收到私人消息,用户也可以。希望这会有所帮助。