在我的应用程序中,我已经实现了更改用户权限,排名等的功能。它工作得很好,如果我更新自己的权限,我可以立即看到更改,因为我可以通过{更新req.user对象{1}}。问题是,当我更新其他用户权限时,它在数据库中更新就好了,但是用户必须重新登录才能看到他们的权限发生变化,因为req.login()
仍然认为他们没有权限。如果他们当然没有登录,这很好,但如果他们是,我希望如果可能的话立即反映他们的变化。
所以我想知道是否有办法更新其他用户req.user
对象,以便他们可以立即看到他们的权限更改而无需退出并重新登录?
或者可能是在返回之前注销并登录该用户的方法吗?
答案 0 :(得分:1)
由于权限位于您自己的数据库中,因此您可以确定,但如何执行此操作取决于您的应用。
假设您正在使用会话,则使用req.user
提供的功能,为每个HTTP请求单独加载存储在passport.deserializeUser
中的对象。通常,您会将用户ID存储在passport.serializeUser
中的会话中,然后从deserializeUser
中的ID检索数据库中的用户。因此,无论何时在后端处理请求,您通常都会在req.user
中获得最新信息,包括权限。当然,您的前端还需要以某种方式获取新权限并自行调整(例如,如果您向用户添加管理员权限,您可能希望他们在UI中查看管理员选项)。
您当然可以将整个用户对象传递给会话存储,并且每个请求跳过一次数据库调用,即。使用这些:
passport.serializeUser(function(user, cb) { cb(null, user); });
passport.deserializeUser(function(user, cb) { cb(null, user); });
用于会话处理。如果执行此操作,则数据库更改不会反映在req.user
对象上。如果用户更新了他们自己的信息,您只需拨打req.logIn(...)
,但不能呼叫其他用户。你可以解决这个问题 - 例如。通过websocket通知相关用户,并让他们的浏览器调用一个用最新用户对象调用req.logIn
的路由,或者深入到会话存储中并直接操作数据。
或者,由于强制退出是一个选项,您可以关注enRaisers应答并从会话存储中找到用户会话,并将其全部删除,从而有效地从后端注销用户。您可以通过API完成会话,或者如果您使用数据库(例如connect-mongo
或connect-redis
)进行会话存储,您还可以打开到同一数据库的另一个连接并使用常规搜索并销毁方法。再次,你仍然需要自己以某种方式处理前端的注销。
答案 1 :(得分:0)
您可以尝试删除会话,或重新生成sessionID。但这会强制该用户重新登录。
如果您的会话存储在mongodb中。然后,您可以按名称 app_sessions 检查收藏,并且它有一个名称 userId 的字段。
在Express会话中有一个名为store的模块。它提供了许多API来通过sessionID查找会话。但遗憾的是没有API可以通过userID查找会话。
因此,如果您想使用session store API,那么您可以调用store.all,它将提供所有会话。但这真是一种残酷的方法。因为我不知道它可能持有多少数据。