ក្រោយពីទំព័រពាក្យសំងាត់ដែលជាឯកសារ login.ejs ត្រូវបានបង្កើតរួចហើយ យើងចាំបាច់ត្រូវបង្កើតយន្តការត្រួតពិនិត្យឈ្មោះអ្នកប្រើប្រាស់និងពាក្យសំងាត់ ដោយបង្កើតមូលដ្ឋានទិន្នន័យនៃបណ្តាអ្នកប្រាស់មួយជាមុនសិន។ យ៉ាងណាម៉ិញ នៅក្នុងបរិបទនៃកម្មវិធីគេហទំព័រ Blog របស់យើង ដែលមានឈ្មោះជាបណ្តោះអាសន្នថា «កំណត់ត្រាយើង» មូលដ្ឋានទិន្នន័យនៃអ្នកប្រើប្រាស់នេះ គឺជាមូលដ្ឋានទិន្នន័យបណ្តាអ្នកនិពន្ធទាំងឡាយណា ដែលនឹងប្រើប្រាស់កម្មវិធីគេហទំព័រ Blog របស់យើង សំរាប់ធ្វើការចុះផ្សាយនូវព័ត៌មានគ្រប់ប្រភេទ។
មួយវិញទៀត ការបង្កើតមូលដ្ឋានទិន្នន័យខាងលើនេះ អាចត្រូវធ្វើឡើងដោយប្រើប្រាស់កម្មវិធីមូលដ្ឋានទិន្នន័យធំៗមួយចំនួនមានដូចជា MySQL និង MongoDB ជាដើម។ ក៏ប៉ុន្តែ ដោយហេតុថាបណ្តាអ្នកនិពន្ធទាំងឡាយនឹងមានចំនួនមិនជាច្រើនណាស់ណាទេនោះ ហើយដើម្បីអោយកាន់តែមានឯករាជ្យភាព យើងអាចបង្កើតមូលដ្ឋានទិន្នន័យនោះនៅក្នុងកម្មវិធីគេហទំព័ររបស់យើងផ្ទាល់តែម្តង ដោយមិនចាំបាច់ប្រើប្រាស់កម្មវិធី MySQL ឬ MongoDB ទាំងនោះឡើយ។
ជាកិច្ចចាប់ផ្តើម ដើម្បីបង្កើតមូលដ្ឋានទិន្នន័យអ្នកនិពន្ធនៅក្នុងកម្មវិធីគេហទំព័រ Blog របស់យើង យើងចាំបាច់ត្រូវបង្កើតថតថ្មីមួយនៅក្នុងថតដើមនៃកម្មវិធីរបស់យើង។ ថតថ្មីនោះអាចមានឈ្មោះជាអ្វីមួយក៏បានដែរ មានដូចជា db (database) ជាដើម។ ហើយបន្ទាប់មកទៀត យើងត្រូវបង្កើតឯកសារ JavaScript ចំនួន ២ ទុកនៅក្នុងថតថ្មីនោះ ដោយដាក់ឈ្មោះអោយវាជាឧទាហរណ៍ថា index.js និង authors.js ជាដើម។

បន្ទាប់មកទៀត នៅក្នុងឯកសារ index.js យើងចាំបាច់ត្រូវសរសេរកូដមួយបន្ទាត់ដូចនៅខាងក្រោមនេះ៖
/* index.js */
exports.authors = require('./authors');
កូដមួយបន្ទាត់ខាងលើនេះ គឺជាការបញ្ជូនកូដទាំងអស់ដែលមាននៅក្នុងឯកសារ authors.js ទៅកាន់កន្លែងណាដែលថត db ត្រូវយកទៅប្រើប្រាស់។ ដោយហេតុថា នៅពេលដែលថត db ត្រូវយកទៅប្រើប្រាស់ ឯកសារ index.js នឹងត្រូវយកទៅប្រើប្រាស់ដោយស្វ័យប្រវត្តិ អាស្រ័យហេតុនេះ យើងអាចប្រើបញ្ជា exports នៅក្នុងឯកសារ index.js សំរាប់បញ្ជូលនូវរាល់បណ្តាឯកសារទិន្នន័យទាំងឡាយណាដែលមាននៅក្នុងថត db ទៅកាន់កន្លែងដែលថតនេះត្រូវយកទៅប្រើប្រាស់។
បន្ទាប់មកទៀត យើងចាំបាច់ត្រូវបង្កើតមូលដ្ឋាននទិន្ននៃអ្នកនិពន្ធ ដោយសរសេរកូដដូចខាងក្រោមនេះ៖
/* authors.js */
var records = [
{ id: 1, username: 'admin', password: 'tin', displayName: 'TIN', emails: [ { value: 'vuthdevelop@gmail.com' } ] },
{ id: 2, username: 'jill', password: 'birthday', displayName: 'Jill', emails: [ { value: 'jill@example.com' } ] },
];
exports.findById = function(id, cb) {
process.nextTick(function() {
var idx = id - 1;
if (records[idx]) {
cb(null, records[idx]);
} else {
cb(new Error('User ' + id + ' does not exist'));
}
});
}
exports.findByUsername = function(username, cb) {
process.nextTick(function() {
for (var i = 0, len = records.length; i < len; i++) {
var record = records[i];
if (record.username === username) {
return cb(null, record);
}
}
return cb(null, null);
});
}
ចាប់ពីបន្ទាត់លេខ 1 រហូតដល់លេខ 5 គឺជាការបង្កើតមូលដ្ឋានទិន្នន័យនៃអ្នកនិន្ធដែលជាវត្ថុមានប្រភេទជា JSON ។ នៅក្នុងមូលដ្ឋានទិន្នន័យនោះ ទិន្នន័យដែលជាឈ្មោះអ្នកប្រើប្រាស់ (username) និងពាក្យសំងាត់ (password) របស់អ្នកនិពន្ធពីររូបត្រូវបានបង្កើតឡើង។
ចាប់ពីបន្ទាត់លេខ 7 រហូតដល់លេខ 16 គឺជាការបង្កើតក្បួនមួយមានឈ្មោះថា findById() សំរាប់យកទៅប្រើប្រាស់ក្នុងគោលបំណងស្រង់យកទិន្នន័យនៃអ្នកនិពន្ធណាម្នាក់នៅក្នុងមូលដ្ឋានទិន្នន័យខាងលើ តាមរយៈអត្តលេខ (ID) ដែលមាននៅក្នុងនៅក្នុងមូលដ្ឋានទិន្នន័យនោះ។
ចាប់ពីបន្ទាត់លេខ 18 រហូតដល់លេខ 23 គឺជាការបង្កើតក្បួនមួយទៀតមានឈ្មោះថា findByUsername() សំរាប់យកទៅប្រើប្រាស់ស្រង់យកទិន្នន័យនៃអ្នកនិពន្ធណាម្នាក់នៅក្នុងមូលដ្ឋានទិន្នន័យខាងលើ តាមរយៈឈ្មោះអ្នកប្រើប្រាស់ (username) ដែលមាននៅក្នុងនៅក្នុងមូលដ្ឋានទិន្នន័យនោះ។
បន្ទាប់មកទៀត យើងត្រូវទាញយកនិងតំលើងកញ្ចប់ passport., passport-local, express-session, connect-ensure-login ដោយសរសេរកូដនៅលើបង្អួចខ្មៅដូចខាងក្រោមនេះ៖
npm install passport
npm install passport-local
npm install express-session
npm install connect-ensure-login
ក្រោមមកទៀត យើងចាំបាច់ត្រូវសរសេរបន្ថែមកូដមួយចំនួននៅក្នងឯកសារ users.js នៅក្នុងថត routes ដោយធ្វើដូចខាងក្រោមនេះ៖
/* users.js */
var express = require('express');
var router = express.Router();
var passport = require('passport');
var Strategy = require('passport-local').Strategy;
var session = require('express-session');
var ifLogedin = require('connect-ensure-login');
var db = require('../db');
passport.use(new Strategy(
function(username, password, cb) {
db.authors.findByUsername(username, function(err, user) {
if (err) { return cb(err); }
if (!user) { return cb(null, false); }
if (user.password != password) { return cb(null, false); }
return cb(null, user);
});
}));
passport.serializeUser(function(user, cb) {
cb(null, user.id);
});
passport.deserializeUser(function(id, cb) {
db.authors.findById(id, function (err, user) {
if (err) { return cb(err); }
cb(null, user);
});
});
router.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: false }));
router.use(passport.initialize());
router.use(passport.session());
/* កំណត់ផ្លូវទៅកាន់ទំព័រគ្រប់គ្រង */
router.get('/',
function(req, res) {
res.render('login');
});
router.post('/login',
passport.authenticate('local', { failureRedirect: '/users' }),
function(req, res) {
res.redirect('/users/dashboard');
});
router.get('/logout',
function(req, res){
req.logout();
res.redirect('/');
});
router.get('/dashboard',
ifLogedin.ensureLoggedIn('/users'),
function(req, res){
res.render('users', { user: req.user, title:"ទំព័រគ្រប់គ្រង" });
});
module.exports = router;
ចាប់ពីបន្ទាត់លេខ 4 ដល់បន្ទាត់លេខ 7 គឺជាចំលងយកក្បួនខ្នាតទាំងអស់ ដែលមាននៅក្នងកញ្ចប់ passport., passport-local, express-session, connect-ensure-login មកប្រើប្រាស់នៅឯកសារ users.js ។
នៅលើបន្ទាត់លេខ 8 គឺជាការចំលងយកក្បួនខ្នាតនិងទិន្នន័យមាននៅក្នុងឯកសារ authors.js ស្ថិតនៅក្នុងថត db មកប្រើប្រាស់ក្នុងឯកសារ users.js ។
នៅលើបន្ទាត់លេខ 10, 20, 24, 31, 32, 33 គឺជាការរៀបចំក្បួនខ្នាតសំខាន់ៗមួយចំនួននៅក្នុងកញ្ចប់ខាងលើ ដែលនឹងត្រូវប្រើប្រាស់ជាយន្តការត្រួតពិនិត្យនិងអនុញ្ញាតឬមិនអនុញ្ញាតអោយចូលទៅកាន់ទំព័រគ្រប់គ្រង។
ចាប់ពីបន្ទា់ត់លេខ 36 ដល់ 39 គឺជាការកំណត់ផ្លូវចូលទៅកាន់ទំព័រពាក្យសំងាត់ (login.ejs) នៅក្នុងថត views នៅពេលដែលមានអ្នកចុចចូលមើលទំព័រគ្រប់គ្រងដែលមានអាស័យដ្ឋានជា «/users» ។
ចាប់ពីបន្ទាត់លេខ 41 ដល់ 45 គឺជាការកំណត់ផ្លូវដែលមានអាស័យដ្ឋានជា «/users/login» សំរាប់ទទួលយកទិន្នន័យពីទំព័រពាក្យសំងាត់ មកធ្វើការត្រួតពិនិត្យថា តើឈ្មោះអ្នកប្រើប្រាស់និងពាក្យសំងាត់ទាំងនោះ មាននៅក្នុងមូលដ្ឋានទិន្នន័យ authors.js ដែរឬទេ។ ហើយបើត្រឹមត្រូវ ផ្លូវទៅកាន់ទំព័រគ្រប់គ្រងនឹងត្រូវបើកចំហរ ដែលជាកត្តាធ្វើអោយទំព័រគ្រប់គ្រងនឹងបង្ហាញខ្លួនឡើង។ ផ្ទុយទៅវិញ បើសិនជាមិនត្រឹមត្រូវទេ ផ្លូវទៅកាន់ទំព័រពាក្យសំងាត់នឹងត្រូវបើកចំហរ ដែលជាកត្តាធ្វើអោយទំព័រពាក្យសំងាត់ត្រូវបង្ហាញវត្តមានឡើងវិញជាថ្មីម្តងទៀត។
ចាប់ពីបន្ទាត់លេខ 47 ដល់ 51 គឺជាការកំណត់ផ្លូវទៅកាន់ទំព័រដើមនិងបិទផ្លូវទៅកាន់ទំព័រគ្រប់គ្រង នៅពេលដែលមានការចុចរួប logout នៅលើទំព័រគ្រប់គ្រង។
ចាប់ពិបន្ទាត់លេខ 53 ដល់ 57 គឺជាការកំណត់ផ្លូវទៅកាន់ទំព័រគ្រប់គ្រង នៅពេលដែលឈ្មោះអ្នកប្រើប្រាស់និងពាក្យសំងាត់ត្រូវបានផ្ទៀងផ្ទាត់ថាពិតជាត្រឹមត្រូវ៕