ក្រោយ​ពី​ទំព័រ​ពាក្យ​សំងាត់ដែល​ជា​ឯកសារ 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 គឺ​ជា​ការកំណត់​ផ្លូវ​ទៅ​កាន់​ទំព័រ​គ្រប់គ្រង នៅ​ពេល​ដែល​ឈ្មោះអ្នក​ប្រើប្រាស់​និង​ពាក្យ​សំងាត់​ត្រូវ​បាន​ផ្ទៀងផ្ទាត់​ថា​ពិត​ជា​ត្រឹមត្រូវ​៕