前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs系统保持一端登录

nodejs系统保持一端登录

作者头像
OECOM
发布2020-07-01 16:51:19
1.2K0
发布2020-07-01 16:51:19
举报
文章被收录于专栏:OECOMOECOMOECOM

为了保证系统的安全性,一般情况下系统要保证一端登录,当其他端用相同的账号进行登录时,将会把该端账号进行退出操作。这种做法可以有效避免多人登录同一账号导致的重复修改或冲突操作,下面,将介绍一下在nodes下使用express-session来进行登录的session控制。

express-session应用

首先我们先来进行的就是安装express-session

npm install express-session

然后要做的就是进行配置了

const SessionTime = 30*60;
const sessionLoginInfo = 'app.session.'
let cookieSessionD = {
    maxAge:SessionTime*1000  // 
}
app.use(session({
    name: 'newaircloudProID',//存储在用户cookie中的key名
    secret: 'newaircloud',  // 用来对session id相关的cookie进行签名
    store: new RedisStrore({
        "host" : redisIP,
        "port" : redisPort,
        "pass" : redisPwd,
        "ttl" : SessionTime,//有效期30分钟,单位秒
        "prefix":sessionLoginInfo,
        "logErrors" : true
    }),  // 本地存储session(文本文件,也可以选择其他store,比如redis的)
    saveUninitialized: false,  // 是否自动保存未初始化的会话,建议false
    resave: true,  // 是否每次都重新保存会话
    rolling:true,// 是否每次都重新保存会话cookie
    cookie: cookieSessionD
}));

简单说明一下,这里我是将session存储到了redis中,这样存储的好处在于分布式系统,可以共享session;另一点在于当后台需要对该账号进行操作处理时,直接处理完成后将该session清空即可,当前账号就自动退出,重新登录则新的修改生效,不存在延迟。

保持系统单一端登录

这里先说一下实现方法。

首先我们知道每一个session都有一个唯一的标识,那就是sessionID。前面express-session的配置项中有一项prefix,这一配置项是用来配置存储在redis中的key的前缀,其后面跟的就是sessionID,如此拼出来的key存储的就是当前session信息。

那么我们要做的就是当登录的时候清除掉已经登录的session,其中遇到的问题就是这个sessionID如何获取的问题。

解决方案就是我们可以在登录的时候将sessionID存储到redis中,比如设置一个key为:app.sessionSingle.userCode,这个key中存储的就是当前登录的sessionID。

当登录时判断该key中是否有值,如果有,则将其对应的session信息清除,然后将此次sessionID存入。此外还需要将此key的过期时间设置的和session登录信息的过期时间保持一致,同时每次访问时需要将过期时间重置,以保证在对应的登录信息有效时间内,此值始终有效。

下面来看具体的代码实现

app.all('/*',async (req,res,next)=>{
    if(req.method!='OPTIONS' &&!req.session.loginInfo){
        console.log("未登录")
        res.json({
            success:false,
            msg:"当前用户未登录"
        });
        return
    }else{
        let loginInfo = req.session.loginInfo
        //此处设置redis过期时间
        //设置代码此处省略
        next()
    }
})
router.post('/login', async (req, res)=>{
    let result = {success:false,msg:""}
    let params = req.body;
    try{
       let currentSession = 'app.sessionSingle.'+userName
        let sessionOldInfo = x //从redis中获取sessionID,此处获取省略代码
      let userInfo = {
        userName:"张三",
        password:"1243"
      }
        req.session.loginInfo = userInfo;
        if(sessionOldInfo){
            //当key中存在sessionID时,则证明当前有用户登录,需清除其session信息
           //删除的redis key为:sessionLoginInfo+sessionOldInfo
        }
        let sessionID = req.sessionID
        //将sessionID存入currentSession,同时设置过期时间

        result.success = true;
        result.msg = "登录成功";
        result.info = userInfo
        res.json(result);

    }catch(e){
        console.log(e.stack);
        result.msg="系统异常,登录失败";
        res.json(result)
    }
});
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • express-session应用
  • 保持系统单一端登录
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档