在处理精灵渠道/插座的身份验证/权限时,架构/技术挑战



因此,我决定重写我在node.js到Elixir上编写的应用程序,因为与Node一起使用Elixir的所有额外的复杂性,Elixir随身携带。

我的问题是我在节点中没有完全正确的问题,并且在长生不老药中变得同样复杂,我不确定如何去接近它。

我正在尝试重新创建许多不和谐的权限。我本质上是在建立一个CRM系统,具有不同的角色,例如"销售经理","销售","客户服务代表"等...但是他们都可以根据其"角色"来做不同的事情。

我需要做的一些事情是能够随时更新一个人或角色的许可。也许"销售经理"角色不能像"会计师"这样的公司财务数据,但我们需要让该特定的人访问几天。或者我有一个"客户服务代表",我们赋予了整个角色,可以将内容添加到日历中。我也想有能力杀死会议。

因此,我见过的几种方法在Elixir论坛上说过,例如:

  • 使用Guardian,我真的很想喜欢令牌,并认为每次听起来都不必打到数据库,但我认为这对此不合时宜。除非有一个很好的解决方案来即时更新令牌。
  • 给每个人自己的过程,然后杀死并开始通过新更改开始更改的过程。这似乎很整洁,但是除非有实际错误,否则我宁愿不杀死过程,我认为该解决方案将带来大问题,例如跟踪问题。尽管我不太熟悉,以至于知道这是否可能会引起问题,或者出于其他原因是否是一个不好的解决方案。
  • 将Guardian与Guardian_DB一起使用,然后击败使用令牌的目的,但至少我会有一个可跟踪的会话。我唯一的问题是我确实打算使用负载量平衡器,以便如果插座连接死亡,我可以将其重新连接到同一台服务器,并且我不确定是否可以使用令牌或套接字本身来执行此操作。附带的会话。不过,这并不是一个很大的问题,并且非常接近我对Node.js。
  • 使用我想远离的redis,然后在更新时根据用户_ID更新redis中的会话数据,并在每个请求中点击redis,以查看用户是否具有权限。我计划最终将其放置在多个服务器上,这意味着ETS是不可行的

所以我想我的问题是

  • 我可以将会话附加到插座上吗?这是一个坏主意吗?
  • 我是否应该仍然使用令牌,然后使用Redis按每个请求检查令牌?
  • 代币仍然比会话更好吗?
  • 是否有我什至没有提到的更好/更轻松的解决方案?

很抱歉,这很长时间,很长,我从来没有像这个项目那样做一些允许的事情,对长生不老药来说是新手。

凤凰通道是有状态的。您可以将数据放在assigns字段中,并且在连接期间一直存在。在对用户进行认证后,您通常将User_id放置在这里。

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

wrt to to permissions问题,我正是这样做的。我要做的是加载启动数据库中的角色权限,并与他们一起构建ETS商店。您可以使用任务或Genserver执行同样的操作。如果给定角色的权限更改,我会更新数据库和ETS表。

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

当需要验证给定用户的权限时,我将诸如Permission.has_permission?("create-room", user, scope)之类的权限模型API调用。我有两个级别的权限,全球和每个房间。这就是范围的用途。

最新更新