PassportJS – 是否可以改变req.user为另一个用户?

在我的应用程序中,我已经实现了更改用户权限,级别等function。如果更新我自己的权限,我可以立即看到更改,因为我可以通过req.login()更新req.user对象req.login() 。 问题是,当我更新另一个用户权限时,它在数据库中更新就好了,但是用户将不得不重新login以查看他们的权限更改,因为req.user仍然认为他们没有权限。 这很好,如果他们没有login当然,但如果他们是,我想这个变化立即反映给他们,如果可能的话。

所以我想知道是否有方法来更新另一个用户req.user对象,以便他们可以立即看到他们的权限变化,而不必注销和返回?

或者返回之前注销并login该用户的一种方法?

由于权限在你自己的数据库中,所以确定你可以,但如何去做取决于你的应用程序。

假设您正在使用会话,通过使用您提供给passport.deserializeUser的函数,存储在req.user对象将分别为每个HTTP请求加载。 您通常会将用户标识存储到passport.serializeUser的会话中,然后使用deserializeUser中的标识从数据库中检索用户。 因此,无论何时在后端处理请求,通常都会在req.user中包含最新的信息,包括权限。 自然你的前端也需要以某种方式获得新的权限和自我调整(例如,如果你添加pipe理员权限给用户,你可能会希望他们看到UI中的pipe理选项)。

你当然可以将整个用户对象传递给会话存储,并且每个请求跳过一个数据库调用。 使用这些:

 passport.serializeUser(function(user, cb) { cb(null, user); }); passport.deserializeUser(function(user, cb) { cb(null, user); }); 

用于会话处理。 如果这样做,那么数据库更改不会反映在req.user对象上。 如果用户更新了自己的信息,您可以调用req.logIn(...) ,但是不能为其他用户调用。 你可以解决这个问题 – 例如。 通过websocket通知有问题的用户,并让他们的浏览器调用一个路由,调用req.logIn与最新的用户对象,或者挖进会话存储并直接在那里操作数据。

或者,由于强制注销是一个选项,您可以按照enRaisers的回答,从会话存储中find用户会话,并删除所有从后端有效注销用户的用户会话。 您可以通过API访问会话,或者如果您使用数据库(例如connect-mongoconnect-redis )进行会话存储,则还可以打开到同一数据库的另一个连接,并使用正常的search和销毁方法。 同样你仍然需要以某种方式处理前端的注销。

您可以尝试删除会话,或重新生成会话ID。 但是这会强制用户重新login。

如果你的会话存储在MongoDB中。 那么你可以通过名称app_sessions检查收集,它有一个名字为userId的字段。

在Express会话中有一个名为store的模块。 它提供了很多API来通过sessionID查找会话。 但不幸的是没有API通过userIDfind会话。

所以,如果你想使用会话存储API,那么你可以调用store.all,这将会给所有的会话。 但这是非常残酷的方法。 因为我不知道它可能持有多less数据。