Architecture/Technical 在 Elixir Channels/Sockets 中处理 Authentication/Permissions 的挑战

Architecture/Technical Challenges in Handling Authentication/Permissions in Elixir Channels/Sockets

所以我决定将我在 Node.js 中编写的应用程序重写为 Elixir,因为 Elixir 开箱即用的 Node 具有额外的复杂性。

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

我正在尝试重现 Discord 如何处理权限。我本质上是在构建一个 CRM 系统,具有不同的角色,如 "Sales Manager"、"Sales"、"Customer Service Rep" 等......但他们都能够根据他们的 "role" 做不同的事情.

我需要做的一些事情是能够即时更新个人或角色的权限。也许 "Sales Manager" 角色不能像 "Accountant" 那样查看公司财务数据,但我们需要授予该特定人员几天的访问权限。或者我有一个 "Customer Service Rep",我们赋予整个角色向日历添加内容的能力。我也想有终止会话的能力。

所以我在 Elixir 论坛上看到了一些说法,比如:

所以我想我的问题是,

很抱歉,这太冗长了,我从来没有像这个项目那样专业地做过许可约束的事情,而且我对 Elixir 还很陌生。

Phoenix 通道是有状态的。您可以将数据放在 assigns 字段中,它会在连接期间保留在那里。这是您通常在对加入用户进行身份验证后放置 user_id 的位置。

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

关于权限问题的角色,我正在这样做。我所做的是在启动时从数据库加载角色权限,并用它们构建一个 ETS 存储。您可以对任务或 GenServer 执行相同的操作。如果给定角色的权限发生变化,我会更新数据库和 ETS table。

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

当需要验证给定用户的权限时,我将权限模型 api 称为 Permission.has_permission?("create-room", user, scope)。我有两级权限,全局权限和每个房间权限。这就是范围的用途。