1. 程式人生 > >express學習-----使用session、cookie判斷使用者登入狀態

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.usernext()獲取cookie判斷是否有cookie根據cookie,從資料庫得到user判斷是否有user儲存user到sessionyesnoyesnoyesno

四. 設定已登入使用者和未登入使用者的許可權。

(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)