如何为广播身份验证路由定义或传递身份验证防护而不是默认身份验证防护?

Posted

技术标签:

【中文标题】如何为广播身份验证路由定义或传递身份验证防护而不是默认身份验证防护?【英文标题】:How to define or pass auth guard for broadcast authentication routes instead of default auth guard? 【发布时间】:2017-09-26 17:14:41 【问题描述】:

我对实时事件广播很陌生,我有简单的 laravel-echo-server 设置并处理一切。我无法针对其他身份验证设置/定义身份验证guard 它总是使用auth.php 中定义的user/default guard 检查 我已经在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

【问题讨论】:

【参考方案1】:

就像在其他地方一样,只需在闭包中使用Requestfacade。

在你的情况下:

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

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

【讨论】:

【参考方案2】:

我终于让它与 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();

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

【讨论】:

以上是关于如何为广播身份验证路由定义或传递身份验证防护而不是默认身份验证防护?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 SQL Server Windows 身份验证配置 Squirrel SQL

具有相同的路由要求而不是身份验证?

如何为 Firebase (Kotlin) 创建自定义身份验证

如何为每个 url 配置 grails/spring 身份验证方案?

我应该如何为 Firebase 身份验证创建新的联合身份提供程序

Relay 和 GraphQL 中的身份验证