iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0

Hi,大家好,昨天我們完成了詳細資料頁面的顯示功能,今天開始要進入客服單輸入的功能,要執行這個功能,有幾個機制要先做出來,首先為了知道是誰留下的客服詢問資訊,或是後續的辦理流程,我們的第一步就是要取得使用者資訊,若是還沒有登入者,就要先導向至登入表單,要求使用者進行帳號密碼驗證,這邊我們先以最簡單的帳號密碼機制來進行認證。

後端 session 機制說明

引用 session 功能

所謂的後端session,通常是jsp、asp.net等後端程式,將資料存在伺服器上的機制,通常的狀況是主機發現這個連線是第一次進來時,會給予client一組 session id,完成系統登入後,session中會有使用者的登入資訊,用以識別這個連線已經進來過了,session會在瀏覽器關閉時清除掉,所以這就是常見的關閉瀏覽器,就要重新登入的狀況。
node.js 亦有自己的 session 處理機制,可以讓我們簡單的來使用,但是預設是沒有掛載該功能的,因此我們必須先引用進來,動作如下

  1. 開啟專案後,點擊檢視->終端
  2. 輸入 npm install express-session --save
  3. 打開 app.js,輸入下列程式碼
var express = require('express');
//加入引用 express-session 套件機制
var session = require('express-session')
//以下省略…
var app = express();
//加入宣告使用session之程式碼
app.use(session({
  secret: 'safmgr',
  resave: true,
  saveUninitialized: true,
  cookie: { secure: true, maxAge: 30 * 60 * 1000 }
}))

說明:
secret用來產出session ID的hash 之用,可自由指定
maxAge 為 session 的閒置時間限制,單位為毫秒,所以上面的範例是 30 分鐘

新增登入頁

打開系統主功能之 router(routers/saf.js),加入登入表單與登錄處理的 router 設定

/**
 * 內部使用者登入頁面
 */
router.get("/loginform", (req, res, next) => {
    //若已登入,則直接導向至已登入人員之首頁
    if(req.session.user) {
        res.redirect("/saf/mgr")
    }
    res.render("loginform", {
        breads: createBreadcrumb("系統登入")
    })
})

/**
 * 系統登入
 */
router.post("/login", async (req, res, next) => {
    try {
        let uid = req.body.uid
        let pwd = req.body.pwd
        //系統帳號驗證
        let userinfo = await userdao.chkuser(uid, pwd)
        if(!userinfo) {
            res.status(500).send("登入失敗")
        } else {
            //通過驗證,寫入session
            req.session.user = userinfo
            res.redirect("/saf/mgr")
        }
    } catch(err) {
        res.status(500).send(err.message || err)
    }
})

說明:
功能很單純,首先/loginform就是純粹的render,最剛開始的 session 驗證可加可不加,我自己是會加上去,讓已經完成登入的使用者不用再輸一次帳號密碼。/login 則是接收表單送過來給資料庫驗證後,通過驗證時就將使用者資訊放到 session 中,然後進行頁面重導的動作

管制頁控制

最後一步是要進行管制區的管制動作,為了避免有人直接繞過系統登入頁,沒有完成登入之連線若是進入管制區,需強制登入,之前我們將管制區的router設定為 /saf/mgr,因此要針對 /routers/mgr.js進行調整,打開/routers/mgr.js,輸入

router.all("/*", (req, res, next) => {
    if(!req.session.user)  {
        res.redirect("/saf")
    }
    next()
})

說明:進入 mgr中的任何網址,都會先檢查是不是有 session.user,若沒有則一律回到系統首頁,否則執行 next 繼續動作

結語

今天先完成 session 的管制區作業與系統登入之功能,登入之表單可以拿 bootstraps 的範例下來改,因此不另外貼出來了,目前這個版本是單純的帳密檢核,算是第一版,明天預計會按照常見的資安要求,強化使用者驗證的機制,那麼,我們明天再繼續吧


上一篇
完成詳細資料顯示
下一篇
使用者登入機制-續
系列文
以vue.js + node.js 搭建一個客服填單系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言