天天看點

express學習筆記:通過session實作使用者登入和權限驗證

作者:高道天

本文介紹如何在express中通過使用express-session中間件實作session存儲和讀取使用者登入資訊。

1、安裝express-session中間件

通過以下指令安裝express-session中間件:

npm i express-session           

2、引用express-session

在express中通過require引入express-session中間件,然後通過use使用express-session中間件并設定預設參數。

const express = require('express');
const session = require('express-session');
 
app = express();
 
app.use(session({
  secret: 'fse',
  resave: false,
  saveUninitialized: true,
}))           

3、儲存使用者登入資訊到session

在使用者登入接口中,如果使用者登入成功,則将使用者資訊儲存到req.session屬性中,隻有引用了express-session中間件後,req中才會有session屬性。

// 登入
app.post('/user/login', (req, res) => {
  // console.log('req', req);
  if(req.body.userName === 'admin' && req.body.password === '111111'){
    req.session.user = req.body;
    req.session.isLogin = true;
    res.send({
      status: 0,
      msg: '登入成功',
    })
  } else {
    res.send({
      status: 1,
      msg: '登入失敗',
    })
  }
})           

4、擷取使用者登入資訊

通過判斷session中是否儲存有使用者登入資訊,如果有則傳回登入資訊,否則提示請先登入。

// 擷取登入名
app.get('/user/userName', (req, res) => {
  if(!req.session?.isLogin){
    res.send({
      status: 1,
      msg: '請先登入',
    })
  } else{
    res.send(req.session.user.userName);
  }
})           

5、使用者登出

使用者登出時,通過調用session的destroy方法銷毀session資訊。req.session中的資料将被清空。

// 登出
app.post('/user/loginOut', (req, res) => {
  req.session.destroy();
  res.send({
    status: 0,
    msg: '登出成功',
  })
})           

6、完整的代碼示例

const { urlencoded } = require('body-parser');
const express = require('express');
const session = require('express-session');
 
app = express();
 
app.use(session({
  secret: 'fse',
  resave: false,
  saveUninitialized: true,
}))
 
app.use(urlencoded({ extended:false }));
 
// 登入
app.post('/user/login', (req, res) => {
  // console.log('req', req);
  if(req.body.userName === 'admin' && req.body.password === '111111'){
    req.session.user = req.body;
    req.session.isLogin = true;
    res.send({
      status: 0,
      msg: '登入成功',
    })
  } else {
    res.send({
      status: 1,
      msg: '登入失敗',
    })
  }
})
 
// 擷取登入名
app.get('/user/userName', (req, res) => {
  if(!req.session?.isLogin){
    res.send({
      status: 1,
      msg: '請先登入',
    })
  } else{
    res.send(req.session.user.userName);
  }
})
 
// 登出
app.post('/user/loginOut', (req, res) => {
  req.session.destroy();
  res.send({
    status: 0,
    msg: '登出成功',
  })
})
 
app.listen(80, () => {
  console.log('http://127.0.0.1');
})           

繼續閱讀