Ismerje meg, hogyan kombinálhatja ezeket a technológiákat egy gyakorlati bemutatóval.
A szerepkör alapú hozzáférés-vezérlés egy biztonságos hitelesítési mechanizmus. Segítségével korlátozhatja az egyes erőforrásokhoz való hozzáférést bizonyos szerepkörrel rendelkező felhasználók számára.
Ez a fajta hitelesítés segít a rendszergazdáknak az engedélyek szabályozásában a felhasználók kijelölt szerepkörének megfelelően. A részletes vezérlés ezen szintje egy biztonsági réteget ad, amely lehetővé teszi az alkalmazások számára, hogy megakadályozzák az illetéktelen hozzáférést.
Szerep alapú hozzáférés-vezérlési mechanizmus megvalósítása Passport.js és JWT használatával
A szerepkör alapú hozzáférés-vezérlés (RBAC) egy népszerű mechanizmus, amellyel a felhasználói szerepkörök és engedélyek alapján kényszerítik ki a hozzáférési korlátozásokat az alkalmazásokban. Különféle módszerek állnak rendelkezésre az RBAC mechanizmus megvalósítására.
Két népszerű megközelítés a dedikált RBAC-könyvtárak, például AcessControl vagy a meglévő hitelesítési könyvtárak kihasználása a mechanizmus megvalósításához.
Ebben az esetben a JSON Web Tokenek (JWT-k) biztonságos módot biztosítanak a hitelesítési adatok továbbítására, míg a Passport.js rugalmas hitelesítést biztosítva egyszerűsíti a hitelesítési folyamatot köztes szoftver.
Ezzel a megközelítéssel szerepköröket rendelhet a felhasználókhoz, és hitelesítéskor kódolhatja őket a JWT-ben. Ezután a JWT segítségével ellenőrizheti a felhasználó személyazonosságát és szerepköreit a következő kérésekben, lehetővé téve a szerepkör alapú engedélyezést és hozzáférés-szabályozást.
Mindkét megközelítésnek megvannak a maga előnyei, és hatékonyak lehetnek az RBAC megvalósításában. A megvalósítási mód közötti választás a projekt konkrét követelményeitől függ.
Letöltheti a projekt kódját innen GitHub adattár.
Állítson be egy Express.js projektet
A kezdéshez állítson be egy Express.js projektet helyileg. Miután beállította a projektet, folytassa és telepítse ezeket a csomagokat:
npm install cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
útlevél útlevél-helyi
Következő, hozzon létre egy MongoDB adatbázist vagy fürt létrehozása a MongoDB Atlason. Másolja ki az adatbázis-kapcsolat URI-jét, és adja hozzá a .env fájl a projekt gyökérkönyvtárában:
CONNECTION_URI="kapcsolat URI"
Állítsa be az adatbázis-kapcsolatot
A gyökérkönyvtárban hozzon létre egy újat utils/db.js fájlt, és adja hozzá az alábbi kódot a kapcsolat létrehozásához az Atlason futó MongoDB-fürttel a Mongoose használatával.
const mangúz = igényelnek('indiai menyét');
const connectDB = async () => {
próbáld ki {
várja mongoose.connect (process.env. CONNECTION_URI);
konzol.log("Csatlakoztatva a MongoDB-hez!");
} fogás (hiba) {
konzol.hiba("Hiba a MongoDB-hez való csatlakozáskor:", hiba);
}
};
modul.exports = connectDB;
Határozza meg az adatmodellt
A gyökérkönyvtárban hozzon létre egy újat model/user.model.js fájlt, és adja hozzá a következő kódot a Mongoose használatával adatmodell meghatározásához a felhasználók adataihoz.
const mangúz = igényelnek('indiai menyét');
const userSchema = új indiai menyét. Séma({
felhasználónév: Húr,
Jelszó: Húr,
szerep: Húr
});
modul.exports = mongoose.model("Felhasználó", userSchema);
Hozzon létre egy vezérlőt az API-végpontokhoz
Újat csinálni controllers/user.controller.js fájlt a gyökérkönyvtárba, és adja hozzá az alábbi kódot.
Először hajtsa végre a következő importálásokat:
const Felhasználó = igényelnek("../models/user.model");
const útlevél = igényelnek('útlevél');
const { GeneratoToken } = igényelnek("../middleware/auth");
igényelnek("../middleware/passport")(útlevél);
Ezután határozza meg a felhasználói regisztráció és a bejelentkezési funkciók kezelésének logikáját:
exports.registerUser = async (req, res) => {
const { felhasználónév, jelszó, szerepkör } = req.body;próbáld ki {
várja User.create({ felhasználónév, jelszó, szerepkör });
res.status(201).json({ üzenet: "Felhasználó sikeresen regisztrálva" });
} fogás (hiba) {
konzol.log (hiba);
res.status(500).json({ üzenet: 'Hiba lépett fel!' });
}
};exports.loginUser = (req, res, next) => {
passport.authenticate('helyi', { ülés: hamis }, (hiba, felhasználó, információ) => {
ha (hiba) {
konzol.log (hiba);Visszatérés res.status(500).json({
üzenet: "Hiba történt a bejelentkezés során"
});
}ha (!felhasználó) {
Visszatérés res.status(401).json({
üzenet: "Érvénytelen bejelentkezési adatok"
});
}req.login (felhasználó, { ülés: hamis }, (hiba) => {
ha (hiba) {
konzol.log (hiba);Visszatérés res.status(500).json({
üzenet: "Hiba történt a bejelentkezés során"
});
}
const { _id, felhasználónév, szerep } = felhasználó;
const hasznos teher = { Felhasználói azonosító: _id, felhasználónév, szerepkör };
const token = generálToken (hasznos terhelés);
res.cookie('jelképes', token, { Csak http: igaz });
Visszatérés res.status(200).json({ üzenet: 'Sikeres bejelentkezés' });
});
})(req, res, next);
};
A registerUser függvény kezeli az új felhasználó regisztrációját a felhasználónév, a jelszó és a szerepkör kinyerésével a kérés törzséből. Ezután új felhasználói bejegyzést hoz létre az adatbázisban, és sikerüzenettel vagy hibaüzenettel válaszol, ha a folyamat során előfordul.
Másrészt a loginUser A funkció megkönnyíti a felhasználói bejelentkezést a Passport.js által biztosított helyi hitelesítési stratégia felhasználásával. Hitelesíti a felhasználó hitelesítő adatait, és sikeres bejelentkezéskor egy tokent ad vissza, amelyet aztán egy cookie-ban tárol a későbbi hitelesített kérésekhez. Ha bármilyen hiba történik a bejelentkezési folyamat során, akkor a megfelelő üzenetet küldi vissza.
Végül adja hozzá azt a kódot, amely megvalósítja az összes felhasználó adatát az adatbázisból lekérő logikát. Ezt a végpontot fogjuk korlátozott útvonalként használni annak biztosítására, hogy csak a szerepkörrel rendelkező jogosult felhasználók legyenek admin hozzáférhet ehhez a végponthoz.
exports.getUsers = async (req, res) => {
próbáld ki {
const felhasználók = várja User.find({});
res.json (felhasználók);
} fogás (hiba) {
konzol.log (hiba);
res.status(500).json({ üzenet: 'Hiba lépett fel!' });
}
};
Állítson be egy Passport.js helyi hitelesítési stratégiát
A felhasználók hitelesítéséhez, miután megadták bejelentkezési hitelesítő adataikat, be kell állítania egy helyi hitelesítési stratégiát.
Újat csinálni middleware/passport.js fájlt a gyökérkönyvtárba, és adja hozzá a következő kódot.
const LocalStrategy = igényelnek(„helyi útlevél”).Stratégia;
const Felhasználó = igényelnek("../models/user.model");modul.export = (útlevél) => {
passport.use(
új LocalStrategy(async (felhasználónév, jelszó, kész) => {
próbáld ki {
const felhasználó = várja User.findOne({ felhasználónév });ha (!felhasználó) {
Visszatérés Kész(nulla, hamis);
}ha (user.password !== jelszó) {
Visszatérés Kész(nulla, hamis);
}
Visszatérés Kész(nulla, felhasználó);
} fogás (hiba) {
Visszatérés kész (hiba);
}
})
);
};
Ez a kód egy helyi passport.js stratégiát határoz meg a felhasználók hitelesítésére a megadott felhasználónév és jelszó alapján.
Először lekérdezi az adatbázist, hogy megtalálja a megfelelő felhasználónévvel rendelkező felhasználót, majd folytatja a jelszó érvényesítését. Következésképpen visszaadja a hitelesített felhasználói objektumot, ha a bejelentkezési folyamat sikeres.
Hozzon létre egy JWT-ellenőrző köztes szoftvert
Benne köztes szoftver könyvtárba, hozzon létre egy új auth.js fájlt, és adja hozzá a következő kódot a JWT-ket előállító és ellenőrző köztes szoftver meghatározásához.
const jwt = igényelnek("jsonwebtoken");
const secretKey = process.env. TITKOS KULCS;const generToken = (hasznos teher) => {
const token = jwt.sign (payload, secretKey, { lejárIn: "1h" });
Visszatérés jelképes;
};const verifyToken = (szükségesRole) =>(req, res, next) => {
const token = req.cookies.token;ha (!token) {
Visszatérés res.status(401).json({ üzenet: "Nincs token megadva" });
}jwt.verify (token, secretKey, (hiba, dekódolt) => {
ha (hiba) {
Visszatérés res.status(401).json({ üzenet: 'Érvénytelen kód' });
}req.userId = dekódolt.felhasználói azonosító;
ha (dekódolt.role !== szükségesRole) {
Visszatérés res.status(403).json({
üzenet: "Nincs jogosultsága és engedélye az erőforrás eléréséhez."
});
}következő();
});
};
modul.exports = {generToken, verifyToken };
A generToken funkció meghatározott lejárati idejű JWT-t hoz létre, míg a verifyToken funkció ellenőrzi, hogy a token megvan-e és érvényes-e. Ezenkívül azt is ellenőrzi, hogy a dekódolt token tartalmazza-e a szükséges szerepet, lényegében biztosítva, hogy csak a jogosult szerepkörrel és jogosultsággal rendelkező felhasználók férhessenek hozzá.
A JWT-k egyedi aláírásához létre kell hoznia egy egyedi titkos kulcsot, és hozzá kell adnia a kulcshoz .env fájlt az alábbiak szerint.
SECRET_KEY="Ez egy titkos kulcs minta."
Határozza meg az API-útvonalakat
A gyökérkönyvtárban hozzon létre egy új mappát, és nevezze el útvonalaknak. Ebben a mappában hozzon létre egy újat userRoutes.js, és adja hozzá a következő kódot.
const expressz = igényelnek('Expressz');
const router = expressz. Router();
const userControllers = igényelnek("../controllers/userController");
const { verifyToken } = igényelnek("../middleware/auth");router.post('/api/regiszter', userControllers.registerUser);
router.post('/api/bejelentkezés', userControllers.loginUser);router.get('/api/felhasználók', verifyToken("admin"), userControllers.getUsers);
modul.exports = útválasztó;
Ez a kód határozza meg a REST API HTTP-útvonalait. A felhasználókat konkrétan a szervereket, mint védett útvonalat. A hozzáférés korlátozásával a felhasználók számára a admin szerepkörrel, hatékonyan érvényesítheti a szerepkör alapú hozzáférés-szabályozást.
Frissítse a fő szerver fájlt
Nyissa meg server.js fájlt, és frissítse az alábbiak szerint:
const expressz = igényelnek('Expressz');
const cors = igényelnek("cors");
const cookieParser = igényelnek("cookie-parser");
const app = express();
const port = 5000;
igényelnek("dotenv").config();
const connectDB = igényelnek('./utils/db');
const útlevél = igényelnek('útlevél');
igényelnek("./middleware/passport")(útlevél);connectDB();
app.use (express.json());
app.use (express.urlencoded({ kiterjedt: igaz }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());const userRoutes = igényelnek('./routes/userRoutes');
app.use('/', userRoutes);
app.listen (port, () => {
konzol.log(`A szerver a porton fut ${port}`);
});
Végül indítsa el a fejlesztőkiszolgálót az alkalmazás futtatásához.
csomópont szerver.js
Használja ki az RBAC-mechanizmust a hitelesítési rendszerek fejlesztéséhez
A szerepalapú hozzáférés-vezérlés megvalósítása hatékony módja az alkalmazások biztonságának növelésének.
Míg a meglévő hitelesítési könyvtárak beépítése egy hatékony RBAC rendszer létrehozása érdekében nagyszerű megközelítés, az RBAC könyvtárak kihasználása a felhasználói szerepkörök kifejezetten definiálása és az engedélyek hozzárendelése még robusztusabb megoldást kínál, végső soron javítva az Ön általános biztonságát. Alkalmazás.