【发布时间】:2020-09-30 16:35:55
【问题描述】:
我正在运行一个带有 PostgreSQL 数据库的 NodeJS express 应用程序。我在 express 中使用 node-cache 模块作为会话管理的存储。
该应用程序有一个用户管理方案,该方案由两种类型的用户组成,普通用户和管理员。管理员可以执行普通用户可以执行的所有任务。除此之外,管理员可以在应用程序中添加/删除用户,还可以向/从用户授予/撤销管理员权限。所以我的问题来了:
如果管理员在用户 X 仍登录时从工具中删除用户 X,那么在用户 X 向服务器发送下一个请求时,他必须自动注销。同样,如果管理员在用户 Y 仍处于登录状态时撤销了用户 Y 的管理员权限,那么在下次访问服务器时,用户 Y 应该会自动注销。
经过一番研究,我想出了两种实现方式:
1) 授权每个请求 - 即编写一个中间件来查询数据库并检查用户是否仍然具有工具访问权限。但是这种方法会为每个请求增加一个额外的数据库命中的开销。我认为这是一个很大的开销,因为在我的应用程序中用户不会被频繁删除,而且用户在已经登录时被删除的可能性也很小。
2) 不要授权每个请求。相反,当用户的工具访问权限被删除时,从缓存中删除该用户的会话(如果有)。因此,当该用户发送请求时,他将被注销,因为他的会话不再存在。但是,这样做并不是那么简单,因为节点缓存(甚至 Redis)没有任何“按值删除”功能。为此,我必须搜索缓存中的所有键,找到值与需要删除会话的用户的 userID 相同的值,然后删除这些会话。
我想知道哪种方法更好更有效,或者是否有第三种更好的方法。
【问题讨论】:
-
欢迎来到 StackOverflow!请更详细地描述您的问题,并提供更多见解,例如解释您想要完成的实际任务,添加错误代码 sn-p 以及您实际尝试过的所有解决方案以消除该问题。在粘贴之前记下添加相应的标签并格式化您的代码。有关更多详细信息,请访问 StackOverflow 的指南,包括 stackoverflow.com/help/how-to-ask。
标签: node.js express session express-session role-based-access-control