nodejs+express+mongodb实现登录并且实现权限
记录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>
-
数据库表结构
在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