因此,我决定将我在 Node.js 中编写的应用程序重写为 Elixir,因为 Elixir 开箱即用的使用 Node 会带来额外的复杂性。
我的问题是我在 Node 中不太正确的问题,并且在 Elixir 中变得同样复杂,我不完全确定如何解决它。
我正在尝试重新创建很多不和谐的权限。我本质上是在构建一个 CRM 系统,具有不同的角色,如“销售经理”、“销售”、“客户服务代表”等……但他们都能够根据自己的“角色”做不同的事情。
我需要做的一些事情是能够即时更新人员或角色的权限。也许“销售经理”角色不能像“会计师”那样查看公司财务数据,但我们需要让该特定人员访问几天。或者我有一个“客户服务代表”,我们让整个角色能够将事情添加到日历中。我也想有能力杀死会话。
所以我在 Elixir 论坛上看到过一些说法,比如:
- 使用 Guardian,我真的很想喜欢令牌,并认为不必每次都访问数据库听起来很棒,但我认为这并不实用。除非有一个很好的解决方案来即时更新我还没有找到的令牌。
- 为每个人提供自己的流程,然后根据新的更改终止并启动流程。这看起来很整洁,但除非出现实际错误,否则我宁愿不杀死进程,我认为这个解决方案会带来很大的问题,比如跟踪问题。虽然我不太熟悉这是否真的会导致问题,或者由于其他原因这是一个糟糕的解决方案。
- 将 Guardian 与 Guardian_DB 一起使用,这会破坏使用令牌的目的,但至少我会有一个可跟踪的会话。我唯一的问题是我确实计划使用负载平衡器,这样如果套接字连接断开,我可以将其重新连接到同一台服务器,但我不确定是否有办法使用令牌或套接字本身有附加到它的会话。不过,这并不是什么大问题,并且与我在 Node.js 中遇到的问题非常接近。
- 使用我想远离的 Redis,然后在更新发生时根据 user_id 更新 Redis 中的会话数据,并在每个请求上点击 Redis 以查看用户是否具有权限。我计划最终将它放在多个服务器上,这意味着 ETS 是不可行的,除非我可以像在 Node.js 中那样对套接字连接进行负载平衡。
所以我想我的问题是,
- 我可以将会话附加到套接字吗?这是一个坏主意吗?
- 我是否还应该使用令牌,并且只使用 Redis 在每个请求上检查令牌?
- 令牌仍然是比会话更好的选择吗?
- 有没有我什至没有提到的更好/更简单的解决方案?
很抱歉,这太冗长了,我从来没有像这个项目那样专业地做一些需要许可的事情,而且我对 Elixir 还是很陌生。