Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Express.JS:两个用户同时登录-在另一个用户登录时保留一个用户cookie_Javascript_Node.js_Session_Cookies_Express - Fatal编程技术网

Javascript Express.JS:两个用户同时登录-在另一个用户登录时保留一个用户cookie

Javascript Express.JS:两个用户同时登录-在另一个用户登录时保留一个用户cookie,javascript,node.js,session,cookies,express,Javascript,Node.js,Session,Cookies,Express,我有一个内置于Express中的应用程序,它有两个不同的用户角色:admin和regular 每当一个人注册时,都会在内部创建两个用户,一个是管理员,另一个是普通用户。它们都是使用相同的电子邮件地址创建的,但每个都有不同的密码 现在,当一个普通用户登录时,只要输入管理员密码,她就可以切换(登录)到对应的管理员 我想添加一个功能,只需按下一个按钮,就可以让他们切换回常规用户,但这意味着在客户端上以某种方式存储常规用户会话cookie 如何在不影响应用程序安全性的情况下实现这一点 以下是我在没有任何

我有一个内置于Express中的应用程序,它有两个不同的用户角色:adminregular

每当一个人注册时,都会在内部创建两个用户,一个是管理员,另一个是普通用户。它们都是使用相同的电子邮件地址创建的,但每个都有不同的密码

现在,当一个普通用户登录时,只要输入管理员密码,她就可以切换(登录)到对应的管理员

我想添加一个功能,只需按下一个按钮,就可以让他们切换回常规用户,但这意味着在客户端上以某种方式存储常规用户会话cookie

如何在不影响应用程序安全性的情况下实现这一点

以下是我在没有任何运气的情况下尝试过的可能方式:

  • 为会话cookie创建两个不同的密钥,每种类型的用户一个密钥,这样可以避免冲突,并且两个cookie可以同时在客户端上共存
  • 更改会话cookie权限,以便我可以从JavaScript客户端访问它并在那里处理它

问题:如果用户首先以管理员身份登录,您是否希望他们能够在不登录的情况下切换到普通用户,或者这不是一个受支持的用例

问题2:您只是在推广您自己的身份验证和用户管理,还是在组合中有其他可能相关的库

想法:不知道您如何安排会话以及如何存储用户,但想想我的方式(即我有一个
user
属性
req.session
):您可以有一个服务器方法-让我们称之为
gradeuser()
。 调用时,它可以简单地将session.user对象更改为与当前管理员用户共享电子邮件地址的普通用户。假设您有一个函数getRegularUserByEmail,它可以根据电子邮件地址查找您的用户,而不需要进行任何密码检查

app.get('/downgradeuser', function downgradeUser(req,res) {

    req.session.user = getRegularUserByEmail(req.session.user.email);
    // render, redirect, send a 200-OK, etc, based on how you're calling it.

});
虽然您可以确保对此方法的访问安全,或在其中添加检查以验证原始session.user是否具有管理员角色,但我的快速想法是,您可能并不需要这样做,因为如果由普通用户调用,结果将是将session.user重置为原来的状态,虽然您可能希望进行检查,以避免不必要的重载用户的开销,也可能是因为您可能会想到一个意外的情况,您需要一个警告。 如果我遗漏了什么,或者由于某种原因这不适合,请告诉我


希望这有帮助。

嗨,巴里,谢谢你的回答。我实际上用的是护照。我认为你的想法是正确的,所以我需要建立另一个Passport LocalStrategy来处理降级,对吗?我不是Passport用户(当我看到它时,我没有看到对我有迫切的需求),所以不要相信我的话。然而,根据我对doc的理解,我认为您需要创建一个新的策略(可能使用passport本地代码作为基础,因为您需要捕获authenticate方法,因为它将允许您访问会话。但这可能是我的误解。