我正在使用 PostgreSQL 数据库运行 NodeJS express 应用程序。我正在使用节点缓存模块作为快速会话管理的存储。
该应用程序有一个用户管理方案,它由两种类型的用户组成,普通用户和管理员。管理员可以执行普通用户可以执行的所有任务。除此之外,管理员可以在应用程序中添加/删除用户,还可以向/从用户授予/撤销管理员权限。所以我的问题来了:
如果管理员在用户 X 仍然登录时从工具中删除了用户 X,那么在用户 X 发送到服务器的下一个请求时,他必须自动注销。类似地,如果管理员在用户 Y 仍然登录时撤销了用户 Y 的管理员权限,那么在下次点击服务器时用户 Y 应该会自动注销。
经过一番研究,我想出了两种实现方式:
1)授权每个请求- 即编写一个中间件来查询数据库并检查用户是否仍然具有工具访问权限。但是这种方法对于每个请求都有一个额外的数据库命中的开销。我认为这是一个很大的开销,因为在我的应用程序中,用户不会经常被删除,而且用户在已经登录时被删除的可能性也很小。
2)不要授权每个请求。相反,当删除用户的工具访问权限时,从缓存中删除该用户的会话(如果有)。因此,当该用户发送请求时,他将被注销,因为他的会话不再存在。但是,这样做并不是那么简单,因为节点缓存(甚至 Redis)没有任何“按值删除”功能。为此,我必须搜索缓存中的所有键,找到与需要删除会话的用户的 userID 值相同的键,然后删除这些会话。
我想知道哪种方法更好更有效,或者是否有第三种更好的方法。