一个小环境和用例:我有这个凤凰应用程序,允许经过身份验证的用户在数据库中搜索,以检索公共数据。未经身份验证的用户使用ajax调用和路由来触发控制器并发回json响应以获得相同的结果。
是否可以将某些未经身份验证的用户连接到私人频道,也可以作为访客或其他东西,以便我可以放弃ajax呼叫?你是如何在你的应用程序中解决这个问题的?
我创建了这样的套接字连接:
socket = new Socket('/socket', {params: {guardian_token: app.guardian_token}})
如果有可能,我应该注意什么?
由于
答案 0 :(得分:0)
没有理由不能这样做。
如果您需要返回不同的数据,具体取决于用户是否经过身份验证,我可能会做一个
"验证:室温:4"和"未经认证:房间:4"。您可能还想创建MyApp.Authenticated.RoomChannel
模块和MyApp.Unauthenticated.RoomChannel
。但是,如果你有很多频道,这可能会有点失控。
handle_in/3
函数中创建不同的分支。在您的连接功能中,在套接字上放置一个标记,说明用户是否已通过身份验证。然后,在handle_in/3
函数中,您可以执行类似
def handle_in(msg, params, socket) do
if socket.assigns.authenticated do
authenticated_request(msg, params, socket)
else
unauthenticated_request(msg, params, socket)
end
end
但是,如果经过身份验证的请求与未经身份验证的请求之间没有数据差异,则不会产生额外的开销。只需做用户问的事情。