美文网首页Node
nodejs+express+mongodb实现登录并且实现权限

nodejs+express+mongodb实现登录并且实现权限

作者: super静_jingjing | 来源:发表于2019-01-25 11:27 被阅读0次

    记录nodejs+express+mongodb实现登录并且实现权限控制,还有登录密码加密处理
    1、使用到的模块
    页面,那就会有ejs,express,
    登录:那就需要数据库mongodb;post提交数据body-parser
    加密:md5-node
    安装这几个模块:npm install XXXX --save

    2.ejs页面
    ejs的页面其实就是html,只是使用<%%>的方式获取数据
    登录页面:

    <form class="form-horizontal" action="/doLogin" method="post">
                    <span class="heading">用户登录</span>
                    <div class="form-group">
                        <input type="text" name="username" class="form-control" id="inputEmail3" placeholder="用户名或电子邮件">
                        <i class="fa fa-user"></I>
                    </div>
                    <div class="form-group help">
                        <input type="password" name="password" class="form-control" id="inputPassword3" placeholder="密 码">
                        <i class="fa fa-lock"></I>
                        <a href="#" class="fa fa-question-circle"></a>
                    </div>
                    <div class="form-group">
                        <div class="main-checkbox">
                            <input type="checkbox" value="None" id="checkbox1" name="check"/>
                            <label for="checkbox1"></label>
                        </div>
                        <span class="text">Remember me</span>
                        <button type="submit" class="btn btn-default">登录</button>
                    </div>
                </form>
    
    1. 数据库表结构
      在mongodb说表结构可能不是很好,应该说是collection结构,
      库名:productmanage---用于整个项目
      collections:user----主要用于登录模块,存储用户信息
      数据:可以登录的用户


      image.png

      4.逻辑分析
      权限控制的逻辑其实很简单,列出功能点
      1、输入用户名登录成功,进入系统内部
      2、未登录用户在通过路由进入系统,重定向到登录
      3、登录过之后可以通过路由进入系统
      4、如果路由是进入的登录页面,不管是否登录过都进入登录页面
      分析以上的功能点怎么实现:就是登录之后将登录信息存到session中,然后使用中间件对所有的路由进行判断。如果session有登录信息,即通过,没有重定向到登录;如果路由是登录,不去查看session直接到登录。
      中间件代码:

    //利用中间件来判断登录状态
    app.use(function (req,res,next) {
        const currPath = req.url;
        if(currPath=="/login" || currPath=="/doLogin"){
            next();
        }else{
            if(req.session.userInfo && req.session.userInfo.username && req.session.userInfo.username!=""){
                //ejs中 设置全局数据 所有的页面都可以使用  在ejs中直接<%=userInfo%>
                app.locals["userInfo"] = req.session.userInfo.username;
                //如果已经登录,继续执行
                next();
            }else{
                //如果未登录,重定向回去
                res.redirect("/login");
            }
        }
    });
    

    和数据库交互进行登录操作

    app.post("/doLogin",function (req,res) {
        //利用bodyParser 获取表单提交的数据
        const param = req.body;
        const pas = md5(param.password);
        MongoClient.connect(dbUrl,function (err,db) {
            if(err){
                console.log(err);
                return;
            }
            var dbo = db.db("productmanage");
            const list = [];
            const result = dbo.collection("user").find({"username":param.username,"password":pas});
            result.toArray(function (err,data) {
                if(err){
                    return;
                }
                if(data&&data.length>0){
                    //保存用户信息,用于权限控制;后台一般使用session来保存用户信息
                    req.session.userInfo = data[0];
                    //跳转到product页面
                    res.redirect("/product");
                }else{
                    res.send("<script>alert('登录失败');location.href='/login';</script>");
                }
                db.close();
            });
            //另一种循坏取数据的方式,略麻烦
            // result.each(function (error,doc) {
            //     if(error){
            //         console.log(error);
            //         return;
            //     }
            //     if(doc!=null){
            //         list.push(doc);
            //     }else{
            //        console.log(list);
            //        db.close();
            //     }
            // })
        })
    });
    

    ejs提供了一个方法可以设置全局数据,这样在ejs页面中可以直接使用,避免频繁传值

    app.locals["userInfo"] = req.session.userInfo.username;
    

    在ejs中使用

    <li><a>欢迎您,<%=userInfo%>></a>
    

    5、md5加密
    加密方式很简单,引入md5包,调用md5的方法,即可对字符串进行加密。md5不可逆向操作,即不可解密,所以直接在数据库中存入加密后的字符串。登录的时候对输入框中的密码进行加密之后再和数据库数据做比对,即可实现密码加密后登录,安全性很高

     const pas = md5(param.password);
    

    git地址:https://github.com/super-jingjing/nodejs-express-ejsAuthorityManagement.git

    相关文章

      网友评论

        本文标题:nodejs+express+mongodb实现登录并且实现权限

        本文链接:https://www.haomeiwen.com/subject/djkmjqtx.html