Websocket 在Elixir通道/套接字中处理身份验证/权限的体系结构/技术挑战

Websocket 在Elixir通道/套接字中处理身份验证/权限的体系结构/技术挑战,websocket,elixir,phoenix-framework,phoenix-channels,Websocket,Elixir,Phoenix Framework,Phoenix Channels,因此,我决定将我一直在Node.js中编写的一个应用程序重写为Elixir,因为Elixir在开箱即用的情况下会带来额外的复杂性 我的问题在Node中并没有完全正确,在Elixir中变得同样复杂,我不完全确定如何着手解决它 我试图重现很多不和谐是如何产生的。我基本上是建立一个CRM系统,有不同的角色,如“销售经理”、“销售人员”、“客户服务代表”等。。。但他们都能根据自己的“角色”做不同的事情 我需要做的一些事情是能够动态更新个人或角色的权限。也许“销售经理”的角色不能像“会计”那样查看公司财务

因此,我决定将我一直在Node.js中编写的一个应用程序重写为Elixir,因为Elixir在开箱即用的情况下会带来额外的复杂性

我的问题在Node中并没有完全正确,在Elixir中变得同样复杂,我不完全确定如何着手解决它

我试图重现很多不和谐是如何产生的。我基本上是建立一个CRM系统,有不同的角色,如“销售经理”、“销售人员”、“客户服务代表”等。。。但他们都能根据自己的“角色”做不同的事情

我需要做的一些事情是能够动态更新个人或角色的权限。也许“销售经理”的角色不能像“会计”那样查看公司财务数据,但我们需要让特定的人访问几天。或者我有一个“客户服务代表”,我们让整个角色都能够在日历上添加内容。我也想有能力杀死会话

因此,我在长生不老药论坛上看到了一些说法,比如:

  • 使用Guardian,我真的很想喜欢代币,并且认为不必每次都点击数据库听起来很棒,但我认为这并不实用。除非有一个很好的解决方案来动态更新令牌,我还没有找到
  • 让每个人都有自己的流程,只需在有新变更的变更上终止并启动流程。这看起来很整洁,但我不希望杀死进程,除非有实际的错误,我认为这个解决方案会带来大问题,比如跟踪问题。虽然我不太熟悉,不知道这是否真的会导致问题,或者这是否是一个糟糕的解决方案,因为其他原因
  • 将Guardian与Guardian_DB一起使用,这会破坏使用代币的目的,但至少我会有一个可跟踪的会话。我唯一的问题是,我确实计划使用负载平衡器,这样,如果套接字连接断开,我可以将其重新连接到同一服务器,但我不确定是否有办法使用令牌或套接字本身是否连接了会话。不过,这并不是什么大问题,与我使用Node.js时遇到的问题非常接近
  • 使用我想远离的Redis,然后在更新发生时根据用户id更新Redis中的会话数据,并在每次请求时点击Redis以查看用户是否具有权限。我计划最终在多台服务器上实现这一点,这意味着除非我能够像Node.js中那样平衡套接字连接,否则ETS是不可行的
所以我想我的问题是

  • 我可以将会话附加到套接字吗?这是个坏主意吗
  • 我是否应该继续使用令牌,并在每次请求时使用Redis检查令牌
  • 代币还是比会话更好的选择吗
  • 有没有更好/更简单的解决方案,我甚至没有提到

很抱歉,这是一个相当漫长的过程,我从来没有做过像这个项目这样受专业许可限制的事情,而且我对长生不老药很陌生。

凤凰频道很有状态。您可以将数据放入
分配
字段中,并在连接期间保持在该字段中。在对用户进行身份验证后,通常会将用户id放在该位置

我还使用通道分配来存储服务器上需要的客户端状态

关于角色到权限的问题,我正是这么做的。我要做的是在启动时从数据库加载角色权限,并使用它们构建ETS存储。您可以对任务或GenServer执行相同的操作。如果给定角色的权限发生更改,我将更新数据库和ETS表

我的用户模型支持每个用户的角色列表


当需要验证给定用户的权限时,我调用权限模型api,如
Permission.has\u Permission?(“create room”,user,scope)
。我有两级权限,全局权限和每个房间权限。这就是作用域的用途。

所以我知道ETS表只在特定的机器上工作。我可能不需要分发它们,但如果我这样做了,我知道我不能用ETS表来分发它们。答案会是像记忆这样的东西吗?