Ugotovite, kako združiti te tehnologije s praktično predstavitvijo.

Nadzor dostopa na podlagi vlog je varen mehanizem za preverjanje pristnosti. Uporabite ga lahko za omejitev dostopa do določenih virov uporabnikom z določenimi vlogami.

Ta vrsta preverjanja pristnosti pomaga sistemskim skrbnikom nadzorovati dovoljenja glede na dodeljene vloge uporabnikov. Ta raven podrobnega nadzora dodaja raven varnosti, ki aplikacijam omogoča, da preprečijo nepooblaščen dostop.

Implementacija mehanizma nadzora dostopa na podlagi vlog z uporabo Passport.js in JWT

Nadzor dostopa na podlagi vlog (RBAC) je priljubljen mehanizem, ki se uporablja za uveljavljanje omejitev dostopa v aplikacijah na podlagi uporabniških vlog in dovoljenj. Za izvajanje mehanizma RBAC so na voljo različne metode.

Dva priljubljena pristopa vključujeta uporabo namenskih knjižnic RBAC, kot je AcessControl ali izkoriščanje obstoječih knjižnic za preverjanje pristnosti za implementacijo mehanizma.

V tem primeru spletni žetoni JSON (JWT) zagotavljajo varen način za prenos poverilnic za preverjanje pristnosti, medtem ko Passport.js poenostavlja postopek avtentikacije z zagotavljanjem prilagodljive avtentikacije vmesna programska oprema.

S tem pristopom lahko uporabnikom dodelite vloge in jih kodirate v JWT, ko se overijo. Nato lahko uporabite JWT za preverjanje uporabnikove identitete in vlog v naslednjih zahtevah, kar omogoča avtorizacijo na podlagi vlog in nadzor dostopa.

Oba pristopa imata svoje prednosti in sta lahko učinkovita pri izvajanju RBAC. Izbira med metodo za izvedbo bo odvisna od posebnih zahtev vašega projekta.

Kodo tega projekta lahko prenesete iz Repozitorij GitHub.

Nastavite projekt Express.js

Za začetek, nastavite projekt Express.js lokalno. Ko nastavite projekt, nadaljujte in namestite te pakete:

npm namestite cors dotenv mongoose razčlenjevalnik piškotkov jsonwebtoken mongodb \
potni list potni list-lokalni

Naslednji, ustvarite bazo podatkov MongoDB oz nastavite gručo na MongoDB Atlas. Kopirajte URI povezave z bazo podatkov in ga dodajte v a .env datoteko v korenskem imeniku vašega projekta:

CONNECTION_URI="URI povezave"

Konfigurirajte povezavo z bazo podatkov

V korenskem imeniku ustvarite nov utils/db.js in dodajte spodnjo kodo, da vzpostavite povezavo z gručo MongoDB, ki se izvaja v Atlasu, z uporabo Mongoose.

konst mungos = zahtevati('mungos');

konst povežiDB = asinh () => {
poskusi {
čakati mongoose.connect (process.env. CONNECTION_URI);
konzola.log("Povezan z MongoDB!");
} ulov (napaka) {
konzola.napaka("Napaka pri povezovanju z MongoDB:", napaka);
}
};

modul.exports = connectDB;

Definirajte podatkovni model

V korenskem imeniku ustvarite nov model/user.model.js in dodajte naslednjo kodo za definiranje podatkovnega modela za podatke uporabnikov z uporabo Mongoose.

konst mungos = zahtevati('mungos');

konst uporabniška shema = novo mungos. Shema({
uporabniško ime: Vrvica,
geslo: Vrvica,
vloga: Vrvica
});

modul.exports = mongoose.model('Uporabnik', uporabniška shema);

Ustvarite krmilnik za končne točke API

Ustvari novo krmilniki/user.controller.js datoteko v korenskem imeniku in dodajte spodnjo kodo.

Najprej izvedite te uvoze:

konst Uporabnik = zahtevati('../models/user.model');
konst potni list = zahtevati('potni list');
konst {generiraj žeton} = zahtevati('../middleware/auth');
zahtevati('../middleware/passport')(potni list);

Nato definirajte logiko za upravljanje registracije uporabnika in funkcije prijave:

exports.registerUser = asinh (req, res) => {
konst { uporabniško ime, geslo, vloga } = req.body;

poskusi {
čakati User.create({ uporabniško ime, geslo, vloga });
res.status(201).json({ sporočilo: 'Uporabnik je uspešno registriran' });
} ulov (napaka) {
konzola.log (napaka);
res.status(500).json({ sporočilo: 'Pojavila se je napaka!' });
}
};

exports.loginUser = (req, res, next) => {
passport.authenticate('lokalno', { sejo: lažno }, (napaka, uporabnik, informacije) => {
če (napaka) {
konzola.log (napaka);

vrnitev res.status(500).json({
sporočilo: 'Pri prijavi je prišlo do napake'
});
}

če (!uporabnik) {
vrnitev res.status(401).json({
sporočilo: 'Neveljavne poverilnice za prijavo'
});
}

req.login (uporabnik, { sejo: lažno }, (napaka) => {
če (napaka) {
konzola.log (napaka);

vrnitev res.status(500).json({
sporočilo: 'Pri prijavi je prišlo do napake'
});
}

konst { _id, uporabniško ime, vloga } = uporabnik;
konst nosilnost = { Uporabniško ime: _id, uporabniško ime, vloga};
konst žeton = generiraj žeton (tovor);
res.piškotek('žeton', žeton, { Samo http: prav });
vrnitev res.status(200).json({ sporočilo: 'Prijava uspešna' });
});
})(req, res, next);
};

The registerUser funkcija obravnava registracijo novega uporabnika tako, da ekstrahira uporabniško ime, geslo in vlogo iz telesa zahteve. Nato ustvari nov uporabniški vnos v bazi podatkov in se odzove s sporočilom o uspehu ali napako, če se med postopkom pojavi kakšna.

Po drugi strani pa je loginUser funkcija olajša prijavo uporabnikov z uporabo lokalne strategije preverjanja pristnosti, ki jo zagotavlja Passport.js. Preverja pristnost uporabnikovih poverilnic in ob uspešni prijavi vrne žeton, ki se nato shrani v piškotek za nadaljnje overjene zahteve. Če se med postopkom prijave pojavi kakšna napaka, bo vrnil ustrezno sporočilo.

Nazadnje dodajte kodo, ki izvaja logiko pridobivanja podatkov vseh uporabnikov iz baze podatkov. To končno točko bomo uporabili kot omejeno pot, da zagotovimo, da bodo samo pooblaščeni uporabniki z vlogo admin lahko dostopa do te končne točke.

exports.getUsers = asinh (req, res) => {
poskusi {
konst uporabniki = čakati User.find({});
res.json (uporabniki);
} ulov (napaka) {
konzola.log (napaka);
res.status(500).json({ sporočilo: 'Pojavila se je napaka!' });
}
};

Nastavite strategijo lokalnega preverjanja pristnosti Passport.js

Za preverjanje pristnosti uporabnikov, potem ko posredujejo svoje poverilnice za prijavo, morate nastaviti lokalno strategijo preverjanja pristnosti.

Ustvari novo vmesna programska oprema/passport.js datoteko v korenskem imeniku in dodajte naslednjo kodo.

konst Lokalna strategija = zahtevati('potni list-lokalni').Strategija;
konst Uporabnik = zahtevati('../models/user.model');

modul.izvozi = (potni list) => {
passport.use(
novo LocalStrategy(asinh (uporabniško ime, geslo, končano) => {
poskusi {
konst uporabnik = čakati User.findOne({uporabniško ime});

če (!uporabnik) {
vrnitev Končano(nič, lažno);
}

če (user.password !== geslo) {
vrnitev Končano(nič, lažno);
}

vrnitev Končano(nič, uporabnik);
} ulov (napaka) {
vrnitev narejeno (napaka);
}
})
);
};

Ta koda definira lokalno strategijo passport.js za preverjanje pristnosti uporabnikov na podlagi njihovega posredovanega uporabniškega imena in gesla.

Najprej poizveduje v zbirki podatkov, da najde uporabnika z ujemajočim se uporabniškim imenom, nato pa nadaljuje s preverjanjem njihovega gesla. Posledično vrne predmet overjenega uporabnika, če je postopek prijave uspešen.

Ustvarite vmesno programsko opremo za preverjanje JWT

Znotraj vmesna programska oprema ustvarite novo datoteko auth.js in dodajte naslednjo kodo za definiranje vmesne programske opreme, ki generira in preverja JWT-je.

konst jwt = zahtevati('jsonwebtoken');
konst secretKey = process.env. SECRET_KEY;

konst generiraj žeton = (tovor) => {
konst žeton = jwt.sign (payload, secretKey, { poteče: '1h' });
vrnitev žeton;
};

konst verifyToken = (zahtevanaVloga) =>(req, res, next) => {
konst žeton = req.cookies.token;

če (!žeton) {
vrnitev res.status(401).json({ sporočilo: 'Žeton ni na voljo' });
}

jwt.verify (žeton, skrivni ključ, (napaka, dekodirano) => {
če (napaka) {
vrnitev res.status(401).json({ sporočilo: 'Neveljaven žeton' });
}

req.userId = decoded.userId;

če (decoded.role !== requiredRole) {
vrnitev res.status(403).json({
sporočilo: 'Nimate pooblastil in dovoljenj za dostop do tega vira.'
});
}

Naslednji();
});
};

modul.exports = {generateToken, verifyToken};

The generateToken ustvari JWT z določenim časom poteka, medtem ko funkcija verifyToken funkcija preveri, ali je žeton prisoten in veljaven. Poleg tega tudi preveri, ali dekodirani žeton vsebuje zahtevano vlogo, kar v bistvu zagotavlja, da imajo dostop samo uporabniki s pooblaščeno vlogo in dovoljenji.

Če želite edinstveno podpisati JWT, morate ustvariti edinstven skrivni ključ in ga dodati svojemu .env datoteko, kot je prikazano spodaj.

SECRET_KEY="To je vzorčni skrivni ključ."

Določite poti API-ja

V korenskem imeniku ustvarite novo mapo in jo poimenujte routes. Znotraj te mape ustvarite novo userRoutes.jsin dodajte naslednjo kodo.

konst izraziti = zahtevati('express');
konst usmerjevalnik = express. Usmerjevalnik();
konst uporabniški krmilniki = zahtevati('../controllers/userController');
konst {verifyToken} = zahtevati('../middleware/auth');

router.post('/api/register', userControllers.registerUser);
router.post('/api/login', userControllers.loginUser);

router.get('/api/uporabniki', verifyToken('admin'), userControllers.getUsers);

modul.exports = usmerjevalnik;

Ta koda definira poti HTTP za API REST. The uporabniki pot posebej, strežniki kot zaščitena pot. Z omejitvijo dostopa uporabnikom z admin vlogo, učinkovito uveljavite nadzor dostopa na podlagi vlog.

Posodobite datoteko glavnega strežnika

Odpri svojo server.js datoteko in jo posodobite na naslednji način:

konst izraziti = zahtevati('express');
konst cors = zahtevati('cors');
konst piškotekParser = zahtevati('razčlenjevalnik piškotkov');
konst app = express();
konst pristanišče = 5000;
zahtevati('dotenv').config();
konst povežiDB = zahtevati('./utils/db');
konst potni list = zahtevati('potni list');
zahtevati('./middleware/passport')(potni list);

povežiDB();

app.use (express.json());
app.use (express.urlencoded({ podaljšan: prav }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());

konst userRoutes = zahtevati('./routes/userRoutes');
app.use('/', uporabniške poti);

app.listen (vrata, () => {
konzola.log(`Strežnik deluje na vratih ${port}`);
});

Na koncu zaženite razvojni strežnik, da zaženete aplikacijo.

strežnik vozlišča.js

Izkoristite mehanizem RBAC za nadgradnjo svojih sistemov za preverjanje pristnosti

Implementacija nadzora dostopa na podlagi vlog je učinkovit način za izboljšanje varnosti vaših aplikacij.

Čeprav je vključevanje obstoječih knjižnic za preverjanje pristnosti za vzpostavitev učinkovitega sistema RBAC odličen pristop, je uporaba knjižnic RBAC za izrecno definiranje uporabniških vlog in dodeljevanje dovoljenj zagotavlja še bolj robustno rešitev, ki na koncu izboljša splošno varnost vašega aplikacija.