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