Saznajte kako kombinirati ove tehnologije uz praktičnu demonstraciju.

Kontrola pristupa temeljena na ulogama siguran je mehanizam provjere autentičnosti. Možete ga koristiti za ograničavanje pristupa određenim resursima korisnicima koji imaju određene uloge.

Ova vrsta provjere autentičnosti pomaže administratorima sustava kontrolirati dopuštenja u skladu s određenim ulogama korisnika. Ova razina detaljne kontrole dodaje sloj sigurnosti, dopuštajući aplikacijama da spriječe neovlašteni pristup.

Implementacija mehanizma kontrole pristupa temeljenog na ulogama pomoću Passport.js i JWT

Kontrola pristupa temeljena na ulogama (RBAC) popularan je mehanizam koji se koristi za nametanje ograničenja pristupa u aplikacijama na temelju korisničkih uloga i dopuštenja. Dostupne su različite metode za implementaciju RBAC mehanizma.

Dva popularna pristupa uključuju korištenje namjenskih RBAC biblioteka kao što je Kontrola pristupa ili korištenje postojećih knjižnica za provjeru autentičnosti za implementaciju mehanizma.

U ovom slučaju, JSON web tokeni (JWT) pružaju siguran način prijenosa vjerodajnica za autentifikaciju, dok Passport.js pojednostavljuje postupak autentifikacije pružajući fleksibilnu autentifikaciju međuprogramska oprema.

Koristeći ovaj pristup, možete dodijeliti uloge korisnicima i kodirati ih u JWT-u kada se autentificiraju. Zatim možete koristiti JWT za provjeru identiteta i uloga korisnika u sljedećim zahtjevima, dopuštajući autorizaciju temeljenu na ulogama i kontrolu pristupa.

Oba pristupa imaju svoje prednosti i mogu biti učinkoviti u implementaciji RBAC-a. Izbor između metode koju ćete implementirati ovisit će o specifičnim zahtjevima vašeg projekta.

Kôd ovog projekta možete preuzeti s GitHub spremište.

Postavite Express.js projekt

Započeti, postaviti Express.js projekt lokalno. Nakon što postavite projekt, samo naprijed i instalirajte ove pakete:

npm instalacija cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
putovnica pasoš-lok

Sljedeći, stvoriti MongoDB bazu podataka ili postaviti klaster na MongoDB Atlas. Kopirajte URI veze s bazom podataka i dodajte ga u a .env datoteku u korijenskom direktoriju vašeg projekta:

CONNECTION_URI="URI veze"

Konfigurirajte vezu s bazom podataka

U korijenskom direktoriju stvorite novi utils/db.js datoteku i dodajte donji kod za uspostavljanje veze s MongoDB klasterom koji radi na Atlasu koristeći Mongoose.

konst mungos = zahtijevati('mungos');

konst povezivanjeDB = asinkroni () => {
probati {
čekati mongoose.connect (process.env. CONNECTION_URI);
konzola.log("Povezan na MongoDB!");
} ulov (pogreška) {
konzola.greška("Pogreška pri povezivanju s MongoDB-om:", pogreška);
}
};

modul.exports = connectDB;

Definirajte podatkovni model

U korijenskom direktoriju stvorite novi model/user.model.js datoteku i dodajte sljedeći kod za definiranje podatkovnog modela za podatke korisnika koristeći Mongoose.

konst mungos = zahtijevati('mungos');

konst korisnička shema = novi mungos. Shema({
Korisničko ime: Niz,
lozinka: Niz,
uloga: Niz
});

modul.izvoz = mongoose.model('Korisnik', korisnička shema);

Stvorite kontroler za API krajnje točke

Stvorite novi kontroleri/user.controller.js datoteku u korijenskom direktoriju i dodajte kod ispod.

Prvo napravite ove uvoze:

konst Korisnik = zahtijevati('../models/user.model');
konst putovnica = zahtijevati('putovnica');
konst {generiraj token} = zahtijevati('../middleware/auth');
zahtijevati('../middleware/passport')(putovnica);

Zatim definirajte logiku za upravljanje registracijom korisnika i funkcijom prijave:

exports.registerUser = asinkroni (req, res) => {
konst { korisničko ime, lozinka, uloga } = req.body;

probati {
čekati User.create({ korisničko ime, lozinka, uloga });
res.status(201).json({ poruka: 'Korisnik se uspješno registrirao' });
} ulov (pogreška) {
konzola.log (greška);
res.status(500).json({ poruka: 'Dogodila se pogreška!' });
}
};

exports.loginUser = (req, res, next) => {
putovnica.authenticate('lokalno', { sjednica: lažno }, (pogreška, korisnik, info) => {
ako (pogreška) {
konzola.log (pogreška);

povratak res.status(500).json({
poruka: 'Došlo je do pogreške prilikom prijave'
});
}

ako (!korisnik) {
povratak res.status(401).json({
poruka: 'Nevažeće vjerodajnice za prijavu'
});
}

req.login (korisnik, { sjednica: lažno }, (greška) => {
ako (pogreška) {
konzola.log (pogreška);

povratak res.status(500).json({
poruka: 'Došlo je do pogreške prilikom prijave'
});
}

konst { _id, korisničko ime, uloga } = korisnik;
konst nosivost = { userId: _id, korisničko ime, uloga};
konst token = generiraj token (korisni teret);
res.cookie('znak', token, { Samo http: pravi });
povratak res.status(200).json({ poruka: 'Uspješna prijava' });
});
})(req, res, next);
};

The registerUser funkcija obrađuje registraciju novog korisnika izdvajanjem korisničkog imena, lozinke i uloge iz tijela zahtjeva. Zatim stvara novi korisnički unos u bazi podataka i odgovara porukom o uspjehu ili pogreškom ako se pojavi tijekom procesa.

S druge strane, loginUser funkcija olakšava prijavu korisnika korištenjem lokalne strategije provjere autentičnosti koju pruža Passport.js. Autentificira korisničke vjerodajnice i vraća token nakon uspješne prijave koji se zatim pohranjuje u kolačić za naknadne autentificirane zahtjeve. Ako dođe do bilo kakve pogreške tijekom procesa prijave, vratit će odgovarajuću poruku.

Na kraju dodajte kod koji implementira logiku dohvaćanja podataka svih korisnika iz baze podataka. Koristit ćemo ovu krajnju točku kao ograničenu rutu kako bismo osigurali da samo ovlašteni korisnici s ulogom admin može pristupiti ovoj krajnjoj točki.

exports.getUsers = asinkroni (req, res) => {
probati {
konst korisnici = čekati User.find({});
res.json (korisnici);
} ulov (pogreška) {
konzola.log (greška);
res.status(500).json({ poruka: 'Dogodila se pogreška!' });
}
};

Postavite strategiju lokalne provjere autentičnosti Passport.js

Za provjeru autentičnosti korisnika nakon što dostave svoje vjerodajnice za prijavu, morate postaviti lokalnu strategiju provjere autentičnosti.

Stvorite novi međuprogram/putovnica.js datoteku u korijenskom direktoriju i dodajte sljedeći kod.

konst Lokalna strategija = zahtijevati('putovnica-lokalna').Strategija;
konst Korisnik = zahtijevati('../models/user.model');

modul.izvoz = (putovnica) => {
putovnica.use(
novi LocalStrategy(asinkroni (korisničko ime, lozinka, gotovo) => {
probati {
konst korisnik = čekati User.findOne({ korisničko ime });

ako (!korisnik) {
povratak gotovo(ništavan, lažno);
}

ako (user.password !== lozinka) {
povratak gotovo(ništavan, lažno);
}

povratak gotovo(ništavan, korisnik);
} ulov (pogreška) {
povratak učinjeno (greška);
}
})
);
};

Ovaj kod definira lokalnu strategiju passport.js za provjeru autentičnosti korisnika na temelju njihovog korisničkog imena i lozinke.

Najprije postavlja upit bazi podataka kako bi pronašao korisnika s odgovarajućim korisničkim imenom, a zatim nastavlja s potvrđivanjem njihove lozinke. Posljedično, vraća autentificirani korisnički objekt ako je proces prijave uspješan.

Stvorite JWT Verification Middleware

Unutar međuprogramska oprema direktorij, kreirajte novu auth.js datoteku i dodajte sljedeći kod za definiranje međuopreme koja generira i provjerava JWT-ove.

konst jwt = zahtijevati('jsonwebtoken');
konst tajniKljuč = proces.env. TAJNI_KLJUČ;

konst generirati token = (nosivost) => {
konst token = jwt.sign (payload, secretKey, { istječe: '1h' });
povratak znak;
};

konst verifyToken = (potrebna uloga) =>(req, res, next) => {
konst token = req.cookies.token;

ako (!token) {
povratak res.status(401).json({ poruka: 'Nije osiguran token' });
}

jwt.verify (token, secretKey, (pogreška, dekodirano) => {
ako (pogreška) {
povratak res.status(401).json({ poruka: 'Pogrešan token' });
}

req.userId = decoded.userId;

ako (decoded.role !== requiredRole) {
povratak res.status(403).json({
poruka: 'Nemate autorizaciju i dopuštenja za pristup ovom resursu.'
});
}

Sljedeći();
});
};

modul.exports = {generiratiToken, verifyToken};

The generiratiToken stvara JWT s određenim vremenom isteka, dok verifyToken funkcija provjerava je li token prisutan i valjan. Osim toga, također provjerava sadrži li dekodirani token potrebnu ulogu, u biti osigurava da pristup imaju samo korisnici s ovlaštenom ulogom i dopuštenjima.

Da biste jedinstveno potpisali JWT-ove, trebate generirati jedinstveni tajni ključ i dodati ga u svoj .env datoteku kao što je prikazano u nastavku.

SECRET_KEY="Ovo je primjer tajnog ključa."

Definirajte API rute

U korijenskom direktoriju stvorite novu mapu i nazovite je routes. Unutar ove mape stvorite novu userRoutes.jsi dodajte sljedeći kod.

konst izraziti = zahtijevati('izraziti');
konst ruter = express. Usmjerivač();
konst korisnički kontroleri = zahtijevati('../controllers/userController');
konst {verifyToken} = zahtijevati('../middleware/auth');

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

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

modul.exports = usmjerivač;

Ovaj kod definira HTTP rute za REST API. The korisnika ruta konkretno, poslužitelji kao zaštićena ruta. Ograničavanjem pristupa korisnicima s admin ulogu, učinkovito provodite kontrolu pristupa temeljenu na ulogama.

Ažurirajte datoteku glavnog poslužitelja

Otvori svoju server.js datoteku i ažurirajte je na sljedeći način:

konst izraziti = zahtijevati('izraziti');
konst cors = zahtijevati('cors');
konst kolačićParser = zahtijevati('cookie-parser');
konst app = express();
konst luka = 5000;
zahtijevati('dotenv').config();
konst povezivanjeDB = zahtijevati('./utils/db');
konst putovnica = zahtijevati('putovnica');
zahtijevati('./middleware/passport')(putovnica);

povezivanjeDB();

app.use (express.json());
app.use (express.urlencoded({ proširena: pravi }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());

konst userRoutes = zahtijevati('./routes/userRoutes');
app.use('/', korisničke rute);

app.listen (port, () => {
konzola.log(`Poslužitelj radi na priključku ${port}`);
});

Na kraju pokrenite razvojni poslužitelj za pokretanje aplikacije.

poslužitelj čvora.js

Iskoristite RBAC mehanizam za unapređenje svojih sustava autentifikacije

Implementacija kontrole pristupa temeljene na ulogama učinkovit je način za poboljšanje sigurnosti vaših aplikacija.

Iako je uključivanje postojećih biblioteka za provjeru autentičnosti za uspostavljanje učinkovitog RBAC sustava odličan pristup, korištenje RBAC biblioteka za eksplicitno definirati korisničke uloge i dodijeliti dopuštenja pruža još robusnije rješenje, u konačnici, poboljšavajući ukupnu sigurnost vašeg primjena.