express学习-----使用session、cookie判断用户登录状态

一. 使用cookie-parser、express-session来处理cookie和session。

// 引入
const cookieParser = require('cookie-parser');
const session = require('express-session');
// 使用
app.use(cookieParser('swq'));// 'swq'是自定义字符串,用来对cookie进行签名,提高安全性。
app.use(session({
    secret: 'swq',
    resave: false,
    saveUninitialized: true
}))

二. 登陆成功后,将用户ID生成cookie。

home.login = (req, res, next) => {
    let data = req.body;
    if(data.username == '') {
        return res.send({resultCode: 400, resultMsg: '用户名为空'});
    } else if(data.password == '') {
        return res.send({resultCode: 400, resultMsg: '密码为空'});
    } else {
        User.findOne({name: data.name}).then(user => {
            if(!user) {
                return res.send({resultCode: 400, resultMsg: '用户不存在'});
            }
            if(data.password != user.password) {
                return res.send({resultCode: 400, resultMsg: '密码错误'});
            }
            //生成cookie
            auth.gen_session(user, res);
            return res.send({resultCode: 200, resultMsg: '登录成功'});
        })
    }
}
// 生成cookie
gen_session: (user, res) => {
    let auth_user = `${user._id}`;
    res.cookie('suweiqing', auth_user, {
        path: '/',
        signed: true,//对cookie密码进行加密的话, 需要使用到cookieParser
        httpOnly: true,
        maxAge: 30 * 24 * 60 * 60 * 1000
    });
},

三. 编写中间件,判断用户是否登录(判断session中是否有用户信息)。

//通过cookie去生成session的方法
app.use(auth.authUser);

authUser: (req, res, next) => {
    //中间件, 所有的请求都要经过它, 我们在这来判断用户的登录情况
    if(req.session.user) {
        next();//用户已经登录情况下, 直接下一步
    }
    else {
        //需要通过cookie去生成session
        //1.获取cookie
        let auth_token = req.signedCookies['suweiqing'];//cookie-parser直接帮我解密了
        if (!auth_token) {
            next();//用户没有cookie的情况
    }
        else {
            //2.通过cookie生成session
            let user_id = auth_token;
            //数据库去找这个用户ID
            User.findOne({_id: user_id}, (err, user) => {
                if (err) {
                    return res.end(err);
                }
                else {
                    if (!user) {
                        next();
                    }
                    else {
                        //3.结束
                        req.session.user = user;
                        next();
                    }
                }
            })
        }
    }
}
Created with Raphaël 2.1.2 判断是否有req.session.user next() 获取cookie 判断是否有cookie 根据cookie,从数据库得到user 判断是否有user 保存user到session yes no yes no yes no

四. 设置已登录用户和未登录用户的权限。

(1)已登录用户不能访问未登录界面
//判断用户未登录的中间件
userRequired: (req, res, next) => {
    if(!req.session || !req.session.user || !req.session.user._id) {
        return res.redirect('/login');
    }
    next();
}
(2)未登录用户不能访问已登录界面
//判断用户已登录的中间件
userNotRequired: (req, res, next) => {
    if(req.session.user != undefined) {
        return res.redirect('back');
    }
    next();
}
(3) 使用权限中间件
router.get('/', auth.userRequired,home.index);
router.get('/login', auth.userNotRequired, home.loginPage)

你可能感兴趣的:(express)