Node

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

2019-01-25  本文已影响0人  super静_jingjing

记录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

上一篇下一篇

猜你喜欢

热点阅读