Sužinokite, kaip šias technologijas derinti su praktiniu demonstravimu.
Vaidmenimis pagrįsta prieigos kontrolė yra saugus autentifikavimo mechanizmas. Galite naudoti jį norėdami apriboti prieigą prie konkrečių išteklių vartotojams, kurie atlieka tam tikrus vaidmenis.
Šio tipo autentifikavimas padeda sistemos administratoriams valdyti leidimus pagal naudotojų paskirtus vaidmenis. Šis detalaus valdymo lygis prideda saugumo lygį, leidžiantį programoms apsisaugoti nuo neteisėtos prieigos.
Vaidmenimis pagrįsto prieigos kontrolės mechanizmo įgyvendinimas naudojant Passport.js ir JWT
Vaidmenimis pagrįsta prieigos kontrolė (RBAC) yra populiarus mechanizmas, naudojamas programų prieigos apribojimams, pagrįstiems vartotojo vaidmenimis ir leidimais, užtikrinti. Yra įvairių būdų, kaip įgyvendinti RBAC mechanizmą.
Du populiarūs metodai apima specialių RBAC bibliotekų naudojimą, pvz AcessControl arba esamų autentifikavimo bibliotekų panaudojimas mechanizmui įgyvendinti.
Šiuo atveju JSON žiniatinklio prieigos raktai (JWT) yra saugus būdas perduoti autentifikavimo kredencialus, o Passport.js supaprastina autentifikavimo procesą, nes suteikia lankstų autentifikavimą tarpinė programinė įranga.
Naudodami šį metodą, galite priskirti vaidmenis vartotojams ir užkoduoti juos JWT, kai jie autentifikuojasi. Tada galite naudoti JWT, kad patikrintumėte vartotojo tapatybę ir vaidmenis vėlesnėse užklausose, leidžiant atlikti įgaliojimus pagal vaidmenį ir valdyti prieigą.
Abu metodai turi savo privalumų ir gali būti veiksmingi įgyvendinant RBAC. Pasirinkimas, kurį metodą įgyvendinti, priklausys nuo konkrečių jūsų projekto reikalavimų.
Šio projekto kodą galite atsisiųsti iš jo GitHub saugykla.
Sukurkite Express.js projektą
Pradėti, nustatyti Express.js projektą vietoje. Kai nustatysite projektą, eikite į priekį ir įdiekite šiuos paketus:
npm įdiegti cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
pasas pasas-vietinis
Kitas, sukurti MongoDB duomenų bazę arba sukurti klasterį MongoDB Atlas. Nukopijuokite duomenų bazės ryšio URI ir pridėkite jį prie a .env failą savo projekto šakniniame projekto kataloge:
CONNECTION_URI="ryšio URI"
Sukonfigūruokite duomenų bazės ryšį
Šakniniame kataloge sukurkite naują utils/db.js failą ir pridėkite toliau pateiktą kodą, kad užmegztumėte ryšį su MongoDB klasteriumi, veikiančiu Atlas naudojant Mongoose.
konst mangustas = reikalauti("mangustas");
konst connectDB = async () => {
bandyti {
laukti mongoose.connect (process.env. CONNECTION_URI);
konsolė.log("Prisijungta prie MongoDB!");
} sugauti (klaida) {
konsolė.error("Klaida jungiantis prie MongoDB:", klaida);
}
};
modulis.exports = connectDB;
Apibrėžkite duomenų modelį
Šakniniame kataloge sukurkite naują model/user.model.js failą ir pridėkite šį kodą, kad apibrėžtumėte duomenų modelį naudotojų duomenims naudojant Mongoose.
konst mangustas = reikalauti("mangustas");
konst userSchema = naujas mangustas. Schema({
Vartotojo vardas: Styga,
Slaptažodis: Styga,
vaidmuo: Styga
});
modulis.exports = mongoose.model('Vartotojas', vartotojoSchema);
Sukurkite API galinių taškų valdiklį
Sukurti naują controllers/user.controller.js failą šakniniame kataloge ir pridėkite žemiau esantį kodą.
Pirmiausia atlikite šiuos importus:
konst Vartotojas = reikalauti(„../models/user.model“);
konst pasas = reikalauti("pasas");
konst {generuoti prieigos raktą} = reikalauti(„../middleware/auth“);
reikalauti(„../middleware/passport“)(pasas);
Tada apibrėžkite vartotojo registracijos ir prisijungimo funkcijų valdymo logiką:
exports.registerUser = async (req, res) => {
konst { vartotojo vardas, slaptažodis, vaidmuo } = req.body;bandyti {
laukti User.create({ vartotojo vardas, slaptažodis, vaidmuo });
res.status(201.json({ žinutę: „Vartotojas sėkmingai užregistruotas“ });
} sugauti (klaida) {
konsolė.log (klaida);
res.status(500.json({ žinutę: 'Įvyko klaida!' });
}
};exports.loginUser = (req, res, next) => {
pass.authenticate('vietinis', { sesija: klaidinga }, (err, user, info) => {
jeigu (err) {
konsolė.log (err);grąžinti res.status(500.json({
žinutė: „Prisijungiant įvyko klaida“
});
}jeigu (!Vartotojas) {
grąžinti res.status(401.json({
žinutė: 'Neteisingi prisijungimo duomenys'
});
}req.login (vartotojas, { sesija: klaidinga }, (err) => {
jeigu (err) {
konsolė.log (err);grąžinti res.status(500.json({
žinutė: „Prisijungiant įvyko klaida“
});
}
konst { _id, vartotojo vardas, vaidmuo } = vartotojas;
konst naudingoji apkrova = { Vartotojo ID: _id, vartotojo vardas, vaidmuo };
konst token = generuoti Token (naudingoji apkrova);
res.cookie("žetonas", žetonas, { Tik http: tiesa });
grąžinti res.status(200.json({ žinutę: „Prisijungimas sėkmingas“ });
});
})(req, res, next);
};
The registruotisVartotojas funkcija tvarko naujo vartotojo registraciją, išskirdama vartotojo vardą, slaptažodį ir vaidmenį iš užklausos turinio. Tada jis sukuria naują vartotojo įrašą duomenų bazėje ir atsako sėkmės pranešimu arba klaida, jei tokia įvyksta proceso metu.
Kita vertus, prisijungtiVartotojas funkcija palengvina vartotojo prisijungimą, naudodama vietinę autentifikavimo strategiją, kurią teikia Passport.js. Jis autentifikuoja vartotojo kredencialus ir sėkmingai prisijungus grąžina prieigos raktą, kuris išsaugomas slapuke vėlesnėms autentifikuotoms užklausoms. Jei prisijungimo proceso metu įvyksta kokių nors klaidų, jis grąžins atitinkamą pranešimą.
Galiausiai pridėkite kodą, kuris įgyvendina logiką, gaunančią visus vartotojų duomenis iš duomenų bazės. Šį galinį tašką naudosime kaip apribotą maršrutą, siekdami užtikrinti, kad tik įgalioti naudotojai, turintys vaidmenį admin gali pasiekti šį galinį tašką.
exports.getUsers = async (req, res) => {
bandyti {
konst vartotojai = laukti User.find({});
res.json (vartotojai);
} sugauti (klaida) {
konsolė.log (klaida);
res.status(500.json({ žinutę: 'Įvyko klaida!' });
}
};
Nustatykite Passport.js vietinio autentifikavimo strategiją
Norėdami autentifikuoti vartotojus po to, kai jie pateikia savo prisijungimo duomenis, turite nustatyti vietinę autentifikavimo strategiją.
Sukurti naują tarpinė programinė įranga/passport.js failą šakniniame kataloge ir pridėkite šį kodą.
konst Vietinė strategija = reikalauti(„pasas-vietinis“).Strategija;
konst Vartotojas = reikalauti(„../models/user.model“);modulis.eksportas = (pasas) => {
pass.use(
naujas LocalStrategy(async (vartotojo vardas, slaptažodis, padaryta) => {
bandyti {
konst vartotojas = laukti User.findOne({ vartotojo vardas });jeigu (!Vartotojas) {
grąžinti padaryta(nulinis, klaidinga);
}jeigu (user.password !== slaptažodis) {
grąžinti padaryta(nulinis, klaidinga);
}
grąžinti padaryta(nulinis, Vartotojas);
} sugauti (klaida) {
grąžinti padaryta (klaida);
}
})
);
};
Šis kodas apibrėžia vietinę passport.js strategiją, skirtą naudotojams autentifikuoti pagal pateiktą vartotojo vardą ir slaptažodį.
Iš pradžių ji užklausia duomenų bazėje, kad surastų vartotoją su atitinkamu vartotojo vardu, o tada patvirtina jo slaptažodį. Todėl, jei prisijungimo procesas sėkmingas, jis grąžina autentifikuotą vartotojo objektą.
Sukurkite JWT patvirtinimo tarpinę programinę įrangą
Viduje tarpinė programinė įranga kataloge, sukurkite naują auth.js failą ir pridėkite šį kodą, kad apibrėžtumėte tarpinę programinę įrangą, kuri generuoja ir tikrina JWT.
konst jwt = reikalauti("jsonwebtoken");
konst secretKey = procesas.env. SECRET_KEY;konst generuotiToken = (naudingoji apkrova) => {
konst token = jwt.sign (naudinga apkrova, slaptasis raktas, { baigiasi: '1h' });
grąžinti žetonas;
};konst verifyToken = (reikalingas vaidmuo) =>(req, res, next) => {
konst token = req.cookies.token;jeigu (!token) {
grąžinti res.status(401.json({ žinutę: „Žetonas nepateiktas“ });
}jwt.verify (token, secretKey, (err, decoded) => {
jeigu (err) {
grąžinti res.status(401.json({ žinutę: „Neteisingas prieigos raktas“ });
}req.userId = decoded.userId;
jeigu (decoded.role !== ReikalingasVaidmuo) {
grąžinti res.status(403.json({
žinutė: „Neturite leidimo ir leidimų pasiekti šį šaltinį“.
});
}Kitas();
});
};
modulis.exports = {generuoti tokeną, patvirtinti ženklą};
The generuoti tokeną funkcija sukuria JWT su nurodytu galiojimo laiku, o verifyToken funkcija patikrina, ar prieigos raktas yra ir galioja. Be to, ji taip pat patikrina, ar iššifruotame prieigos rakte yra reikalingas vaidmuo, iš esmės užtikrinant, kad prieigą turėtų tik tie vartotojai, turintys įgaliotą vaidmenį ir leidimus.
Norėdami unikaliai pasirašyti JWT, turite sugeneruoti unikalų slaptąjį raktą ir pridėti jį prie savo .env failą, kaip parodyta žemiau.
SECRET_KEY="Tai slaptojo rakto pavyzdys."
Apibrėžkite API maršrutus
Šakniniame kataloge sukurkite naują aplanką ir pavadinkite jį maršrutais. Šiame aplanke sukurkite naują userRoutes.jsir pridėkite šį kodą.
konst išreikšti = reikalauti("išreikšti");
konst maršrutizatorius = greitasis. Maršrutizatorius ();
konst userControllers = reikalauti(„../controllers/userController“);
konst { verifyToken } = reikalauti(„../middleware/auth“);router.post('/api/registras', userControllers.registerUser);
router.post('/api/login', userControllers.loginUser);router.get(„/api/users“, verifyToken("adminas"), userControllers.getUsers);
modulis.exports = maršrutizatorius;
Šis kodas apibrėžia REST API HTTP maršrutus. The vartotojų maršrutas, serveriai kaip apsaugotas maršrutas. Apribojant prieigą vartotojams, turintiems admin vaidmenį, veiksmingai įgyvendinate vaidmenimis pagrįstą prieigos kontrolę.
Atnaujinkite pagrindinio serverio failą
Atidaryk savo server.js failą ir atnaujinkite jį taip:
konst išreikšti = reikalauti("išreikšti");
konst cors = reikalauti("cors");
konst cookieParser = reikalauti("slapukų analizatorius");
konst programa = express ();
konst prievadas = 5000;
reikalauti('dotenv'.config();
konst connectDB = reikalauti('./utils/db');
konst pasas = reikalauti("pasas");
reikalauti(„./middleware/passport“)(pasas);connectDB();
app.use (express.json());
app.use (express.urlencoded({ pratęstas: tiesa }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());konst userRoutes = reikalauti('./routes/userRoutes');
app.use('/', userRoutes);
app.listen (port, () => {
konsolė.log(`Serveris veikia prievade ${port}`);
});
Galiausiai paleiskite kūrimo serverį, kad paleistumėte programą.
mazgo serveris.js
Pasinaudokite RBAC mechanizmu, kad pagerintumėte savo autentifikavimo sistemas
Vaidmenimis pagrįstos prieigos kontrolės įdiegimas yra veiksmingas būdas padidinti programų saugumą.
Nors esamų autentifikavimo bibliotekų įtraukimas siekiant sukurti efektyvią RBAC sistemą yra puikus būdas, RBAC bibliotekų panaudojimas aiškiai apibrėžti vartotojo vaidmenis ir priskirti leidimus suteikia dar patikimesnį sprendimą, galiausiai padidinantį bendrą jūsų taikymas.