Opi yhdistämään nämä tekniikat käytännön esittelyyn.

Rooliperusteinen kulunvalvonta on turvallinen todennusmekanismi. Voit käyttää sitä rajoittamaan pääsyä tiettyihin resursseihin käyttäjille, joilla on tietyt roolit.

Tämäntyyppinen todennus auttaa järjestelmänvalvojia hallitsemaan käyttöoikeuksia käyttäjien määrittämien roolien mukaan. Tämä tasoinen hallinta lisää suojaustasoa, jolloin sovellukset voivat estää luvattoman käytön.

Roolipohjaisen kulunvalvontamekanismin käyttöönotto Passport.js: n ja JWT: n avulla

Roolipohjainen pääsynhallinta (RBAC) on suosittu mekanismi, jota käytetään käyttörajoitusten pakottamiseen sovelluksissa käyttäjärooleihin ja käyttöoikeuksiin perustuen. On olemassa erilaisia ​​menetelmiä RBAC-mekanismin toteuttamiseksi.

Kaksi suosittua lähestymistapaa ovat omistettujen RBAC-kirjastojen käyttö, kuten AcessControl tai hyödyntämällä olemassa olevia todennuskirjastoja mekanismin toteuttamiseksi.

Tässä tapauksessa JSON Web Tokens (JWT) tarjoaa turvallisen tavan lähettää todennuskirjautumistiedot, kun taas Passport.js yksinkertaistaa todennusprosessia tarjoamalla joustavaa todennusta väliohjelmisto.

Käyttämällä tätä lähestymistapaa voit määrittää käyttäjille rooleja ja koodata ne JWT: hen, kun he todentavat. Tämän jälkeen voit käyttää JWT: tä käyttäjän henkilöllisyyden ja roolien tarkistamiseen myöhemmissä pyynnöissä, mikä mahdollistaa roolipohjaisen valtuutuksen ja käyttöoikeuksien hallinnan.

Molemmilla lähestymistavoilla on etunsa, ja ne voivat olla tehokkaita RBAC: n toteuttamisessa. Toteutustavan valinta riippuu hankkeesi erityisvaatimuksista.

Voit ladata tämän projektin koodin osoitteesta GitHub-arkisto.

Määritä Express.js-projekti

Aloita määritä Express.js-projekti paikallisesti. Kun olet määrittänyt projektin, jatka ja asenna nämä paketit:

npm asentaa cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
passi passi-paikallinen

Seuraava, luo MongoDB-tietokanta tai perustaa klusterin MongoDB Atlasissa. Kopioi tietokantayhteyden URI ja lisää se kohtaan a .env tiedosto projektisi juurihakemistossa:

CONNECTION_URI="yhteyden URI"

Määritä tietokantayhteys

Luo juurihakemistoon uusi utils/db.js tiedosto ja lisää alla oleva koodi luodaksesi yhteyden MongoDB-klusteriin, joka toimii Atlasissa Mongoose-sovelluksen avulla.

konst mangusti = vaatia('mungo');

konst connectDB = asynk () => {
yrittää {
odottaa mongoose.connect (process.env. CONNECTION_URI);
konsoli.Hirsi("Yhdistetty MongoDB: hen!");
} ottaa kiinni (virhe) {
konsoli.virhe("Virhe yhdistettäessä MongoDB: hen:", virhe);
}
};

moduuli.exports = connectDB;

Määritä tietomalli

Luo juurihakemistoon uusi model/user.model.js tiedosto ja lisää seuraava koodi määrittääksesi tietomallin käyttäjien tiedoille Mongoosea käyttämällä.

konst mangusti = vaatia('mungo');

konst userSchema = Uusi mungo. Schema({
käyttäjätunnus: merkkijono,
Salasana: merkkijono,
rooli: merkkijono
});

moduuli.exports = mangoose.model("Käyttäjä", userSchema);

Luo ohjain API-päätepisteille

Luoda uusi controllers/user.controller.js tiedosto juurihakemistoon ja lisää alla oleva koodi.

Tee ensin nämä tuonnit:

konst Käyttäjä = vaatia('../models/user.model');
konst passi = vaatia('passi');
konst { generoi Token } = vaatia("../middleware/auth");
vaatia("../middleware/passi")(passi);

Määritä seuraavaksi logiikka käyttäjien rekisteröinnin ja kirjautumistoimintojen hallitsemiseksi:

exports.registerUser = asynk (req, res) => {
konst { käyttäjätunnus, salasana, rooli } = req.body;

yrittää {
odottaa User.create({ käyttäjätunnus, salasana, rooli });
res.status(201).json({ viesti: "Käyttäjä rekisteröity onnistuneesti" });
} ottaa kiinni (virhe) {
konsoli.log (virhe);
res.status(500).json({ viesti: 'Tapahtui virhe!' });
}
};

exports.loginUser = (req, res, next) => {
pass.authenticate('paikallinen', { istunto: väärä }, (err, user, info) => {
jos (err) {
konsoli.log (err);

palata res.status(500).json({
viesti: "Tapahtui virhe kirjautuessa"
});
}

jos (!käyttäjä) {
palata res.status(401).json({
viesti: 'Väärät kirjautumistiedot'
});
}

req.login (käyttäjä, { istunto: väärä }, (err) => {
jos (err) {
konsoli.log (err);

palata res.status(500).json({
viesti: "Tapahtui virhe kirjautuessa"
});
}

konst { _id, käyttäjänimi, rooli } = käyttäjä;
konst hyötykuorma = { käyttäjätunnus: _id, käyttäjätunnus, rooli };
konst token = generoToken (hyötykuorma);
res.cookie("tunnus", tunnus, { Vain http: totta });
palata res.status(200).json({ viesti: 'Kirjautuminen onnistui' });
});
})(req, res, next);
};

The rekisteröidyKäyttäjä -toiminto käsittelee uuden käyttäjän rekisteröinnin poimimalla käyttäjänimen, salasanan ja roolin pyynnön rungosta. Sitten se luo uuden käyttäjämerkinnän tietokantaan ja vastaa onnistumisviestillä tai virheellä, jos sellainen tapahtuu prosessin aikana.

Toisaalta, kirjauduKäyttäjä toiminto helpottaa käyttäjän kirjautumista käyttämällä Passport.js: n tarjoamaa paikallista todennusstrategiaa. Se todentaa käyttäjän tunnistetiedot ja palauttaa onnistuneen kirjautumisen yhteydessä tunnuksen, joka sitten tallennetaan evästeeseen myöhempiä todennettuja pyyntöjä varten. Jos kirjautumisprosessin aikana tapahtuu virheitä, se palauttaa asianmukaisen viestin.

Lisää lopuksi koodi, joka toteuttaa logiikan, joka hakee kaikki käyttäjien tiedot tietokannasta. Käytämme tätä päätepistettä rajoitettuna reittinä varmistaaksemme, että vain valtuutetut käyttäjät, joilla on rooli järjestelmänvalvoja voi käyttää tätä päätepistettä.

exports.getUsers = asynk (req, res) => {
yrittää {
konst käyttäjät = odottaa User.find({});
res.json (käyttäjät);
} ottaa kiinni (virhe) {
konsoli.log (virhe);
res.status(500).json({ viesti: 'Tapahtui virhe!' });
}
};

Määritä Passport.js: n paikallinen todennusstrategia

Jotta käyttäjät voidaan todentaa sen jälkeen, kun he ovat antaneet kirjautumistietonsa, sinun on määritettävä paikallinen todennusstrategia.

Luoda uusi middleware/passport.js tiedosto juurihakemistoon ja lisää seuraava koodi.

konst Paikallinen strategia = vaatia('passi-paikallinen').Strategia;
konst Käyttäjä = vaatia('../models/user.model');

moduuli.vienti = (passi) => {
pass.use(
Uusi LocalStrategy(asynk (käyttäjätunnus, salasana, valmis) => {
yrittää {
konst käyttäjä = odottaa User.findOne({ käyttäjänimi });

jos (!käyttäjä) {
palata tehty(tyhjä, väärä);
}

jos (käyttäjä.salasana !== salasana) {
palata tehty(tyhjä, väärä);
}

palata tehty(tyhjä, käyttäjä);
} ottaa kiinni (virhe) {
palata tehty (virhe);
}
})
);
};

Tämä koodi määrittää paikallisen passport.js-strategian käyttäjien todentamiseksi heidän antamansa käyttäjätunnuksen ja salasanan perusteella.

Aluksi se kysyy tietokannasta löytääkseen käyttäjän, jolla on vastaava käyttäjätunnus, ja jatkaa sitten hänen salasanansa vahvistamista. Näin ollen se palauttaa todetun käyttäjäobjektin, jos kirjautuminen onnistuu.

Luo JWT-vahvistusväliohjelmisto

Sisällä väliohjelmisto hakemistoon, luo uusi auth.js-tiedosto ja lisää seuraava koodi määrittääksesi väliohjelmiston, joka luo ja tarkistaa JWT: t.

konst jwt = vaatia("jsonwebtoken");
konst secretKey = process.env. SALAINEN AVAIN;

konst generoToken = (hyötykuorma) => {
konst token = jwt.sign (hyötykuorma, salainen avain, { vanhenee: '1h' });
palata token;
};

konst verifyToken = (vaadittu Rooli) =>(req, res, next) => {
konst token = req.cookies.token;

jos (!tunnus) {
palata res.status(401).json({ viesti: "Ei merkkiä annettu" });
}

jwt.verify (tunnus, secretKey, (err, decoded) => {
jos (err) {
palata res.status(401).json({ viesti: "Virheellinen tunnus" });
}

req.userId = purettu.käyttäjätunnus;

jos (dekoodattu.role !== vaadittuRooli) {
palata res.status(403).json({
viesti: "Sinulla ei ole valtuuksia eikä oikeuksia käyttää tätä resurssia."
});
}

Seuraava();
});
};

moduuli.exports = {generoToken, verifyToken };

The generoi Token -toiminto luo JWT: n tietyllä vanhenemisajalla, kun taas vahvista Token toiminto tarkistaa, onko tunnus olemassa ja kelvollinen. Lisäksi se myös varmistaa, että dekoodattu token sisältää vaaditun roolin, mikä varmistaa, että vain käyttäjillä, joilla on valtuutettu rooli ja käyttöoikeudet, on pääsy.

Jos haluat allekirjoittaa JWT: t yksilöllisesti, sinun on luotava yksilöllinen salainen avain ja lisättävä se omaan tietoosi .env tiedosto alla olevan kuvan mukaisesti.

SECRET_KEY="Tämä on esimerkkisalainen avain."

Määritä API-reitit

Luo juurihakemistoon uusi kansio ja nimeä sille reitit. Luo tämän kansion sisällä uusi userRoutes.jsja lisää seuraava koodi.

konst express = vaatia('ilmaista');
konst reititin = express. Reititin();
konst userControllers = vaatia('../controllers/userController');
konst { verifyToken } = vaatia("../middleware/auth");

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

router.get('/api/käyttäjät', verifyToken('admin'), userControllers.getUsers);

moduuli.exports = reititin;

Tämä koodi määrittää HTTP-reitit REST API: lle. The käyttäjiä reittiä erityisesti palvelimet suojattuna reittinä. Rajoittamalla pääsyä käyttäjille, joilla on järjestelmänvalvoja rooliin, käytät tehokkaasti roolipohjaista pääsynhallintaa.

Päivitä pääpalvelintiedosto

Avaa sinun server.js tiedosto ja päivitä se seuraavasti:

konst express = vaatia('ilmaista');
konst cors = vaatia("cors");
konst cookieParser = vaatia('cookie-parser');
konst sovellus = express();
konst portti = 5000;
vaatia('dotenv').config();
konst connectDB = vaatia('./utils/db');
konst passi = vaatia('passi');
vaatia('./middleware/passport')(passi);

connectDB();

app.use (express.json());
app.use (express.urlencoded({ laajennettu: totta }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());

konst userRoutes = vaatia('./routes/userRoutes');
app.use('/', userRoutes);

app.listen (portti, () => {
konsoli.Hirsi(`Palvelin toimii portissa ${port}`);
});

Käynnistä lopuksi kehityspalvelin sovelluksen suorittamiseksi.

solmupalvelin.js

Käytä RBAC-mekanismia parantaaksesi todennusjärjestelmiäsi

Roolipohjaisen pääsynhallinnan käyttöönotto on tehokas tapa parantaa sovellusten turvallisuutta.

Vaikka olemassa olevien todennuskirjastojen yhdistäminen tehokkaan RBAC-järjestelmän luomiseksi on loistava lähestymistapa, RBAC-kirjastojen hyödyntäminen käyttäjäroolien ja käyttöoikeuksien määrittäminen selkeästi tarjoaa entistä vankemman ratkaisun, mikä parantaa viime kädessä yleistä turvallisuuttasi. sovellus.