Μάθετε πώς να συνδυάσετε αυτές τις τεχνολογίες με μια πρακτική επίδειξη.

Ο έλεγχος πρόσβασης βάσει ρόλων είναι ένας ασφαλής μηχανισμός ελέγχου ταυτότητας. Μπορείτε να το χρησιμοποιήσετε για να περιορίσετε την πρόσβαση σε συγκεκριμένους πόρους σε χρήστες που έχουν συγκεκριμένους ρόλους.

Αυτός ο τύπος ελέγχου ταυτότητας βοηθά τους διαχειριστές συστήματος να ελέγχουν τα δικαιώματα σύμφωνα με τους καθορισμένους ρόλους των χρηστών. Αυτό το επίπεδο λεπτομερούς ελέγχου προσθέτει ένα επίπεδο ασφάλειας, επιτρέποντας στις εφαρμογές να αποτρέπουν τη μη εξουσιοδοτημένη πρόσβαση.

Εφαρμογή μηχανισμού ελέγχου πρόσβασης βάσει ρόλων με χρήση Passport.js και JWT

Ο έλεγχος πρόσβασης βάσει ρόλων (RBAC) είναι ένας δημοφιλής μηχανισμός που χρησιμοποιείται για την επιβολή περιορισμών πρόσβασης σε εφαρμογές που βασίζονται σε ρόλους και δικαιώματα χρήστη. Υπάρχουν διάφορες διαθέσιμες μέθοδοι για την εφαρμογή του μηχανισμού RBAC.

Δύο δημοφιλείς προσεγγίσεις περιλαμβάνουν τη χρήση αποκλειστικών βιβλιοθηκών RBAC όπως

AcessControl ή αξιοποιώντας υπάρχουσες βιβλιοθήκες ελέγχου ταυτότητας για την υλοποίηση του μηχανισμού.

Σε αυτήν την περίπτωση, τα JSON Web Tokens (JWT) παρέχουν έναν ασφαλή τρόπο μετάδοσης διαπιστευτηρίων ελέγχου ταυτότητας, ενώ το Passport.js απλοποιεί τη διαδικασία ελέγχου ταυτότητας παρέχοντας ευέλικτο έλεγχο ταυτότητας ενδιάμεσο λογισμικό.

Χρησιμοποιώντας αυτήν την προσέγγιση, μπορείτε να εκχωρήσετε ρόλους σε χρήστες και να τους κωδικοποιήσετε στο JWT κατά τον έλεγχο ταυτότητας. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το JWT για να επαληθεύσετε την ταυτότητα και τους ρόλους του χρήστη σε επόμενα αιτήματα, επιτρέποντας εξουσιοδότηση βάσει ρόλου και έλεγχο πρόσβασης.

Και οι δύο προσεγγίσεις έχουν τα πλεονεκτήματά τους και μπορούν να είναι αποτελεσματικές στην εφαρμογή του RBAC. Η επιλογή μεταξύ της μεθόδου που θα εφαρμοστεί θα εξαρτηθεί από τις συγκεκριμένες απαιτήσεις του έργου σας.

Μπορείτε να κάνετε λήψη του κώδικα αυτού του έργου από το Αποθετήριο GitHub.

Ρυθμίστε ένα έργο Express.js

Για να ξεκινήσετε, ρυθμίστε ένα έργο Express.js τοπικά. Μόλις ρυθμίσετε το έργο, προχωρήστε και εγκαταστήστε αυτά τα πακέτα:

npm εγκατάσταση cors dotenv mongoose cookie-parser jsonwebtoken mongodb \
διαβατήριο διαβατήριο-τοπικό

Επόμενο, δημιουργήστε μια βάση δεδομένων MongoDB ή δημιουργήστε ένα σύμπλεγμα στο MongoDB Atlas. Αντιγράψτε το URI σύνδεσης βάσης δεδομένων και προσθέστε το στο α .env αρχείο στον ριζικό κατάλογο του έργου σας:

CONNECTION_URI="URI σύνδεσης"

Διαμορφώστε τη σύνδεση βάσης δεδομένων

Στον ριζικό κατάλογο, δημιουργήστε ένα νέο utils/db.js αρχείο και προσθέστε τον παρακάτω κώδικα για να δημιουργήσετε τη σύνδεση με το σύμπλεγμα MongoDB που εκτελείται στον Atlas χρησιμοποιώντας το Mongoose.

συνθ μαγκούστα = απαιτώ('μαγκούστα');

συνθ connectDB = ασυγχρονισμός () => {
δοκιμάστε {
αναμένω mongoose.connect (process.env. CONNECTION_URI);
κονσόλα.κούτσουρο("Συνδέθηκε στο MongoDB!");
} σύλληψη (λάθος) {
κονσόλα.λάθος("Σφάλμα σύνδεσης στο MongoDB:", λάθος);
}
};

μονάδα μέτρησης.exports = connectDB;

Ορίστε το μοντέλο δεδομένων

Στον ριζικό κατάλογο, δημιουργήστε ένα νέο model/user.model.js και προσθέστε τον ακόλουθο κώδικα για να ορίσετε ένα μοντέλο δεδομένων για τα δεδομένα των χρηστών χρησιμοποιώντας το Mongoose.

συνθ μαγκούστα = απαιτώ('μαγκούστα');

συνθ userSchema = νέος μαγκούστα. Σχήμα({
όνομα χρήστη: Σειρά,
Κωδικός πρόσβασης: Σειρά,
ρόλος: Σειρά
});

μονάδα μέτρησης.exports = mongoose.model('Χρήστης', userSchema);

Δημιουργήστε τον ελεγκτή για τα τελικά σημεία του API

Δημιούργησε ένα νέο controllers/user.controller.js αρχείο στον ριζικό κατάλογο και προσθέστε τον παρακάτω κώδικα.

Πρώτα, πραγματοποιήστε αυτές τις εισαγωγές:

συνθ Χρήστης = απαιτώ("../models/user.model");
συνθ διαβατήριο = απαιτώ('διαβατήριο');
συνθ {genereToken} = απαιτώ("../middleware/auth");
απαιτώ("../μεσαίο λογισμικό/διαβατήριο")(διαβατήριο);

Στη συνέχεια, ορίστε τη λογική για τη διαχείριση της λειτουργίας εγγραφής χρήστη και σύνδεσης:

exports.registerUser = ασυγχρονισμός (απαιτ., ανταπ.) => {
συνθ { όνομα χρήστη, κωδικός πρόσβασης, ρόλος } = req.body;

δοκιμάστε {
αναμένω User.create({ όνομα χρήστη, κωδικός πρόσβασης, ρόλος });
res.status(201).json({ μήνυμα: "Ο χρήστης εγγράφηκε με επιτυχία" });
} σύλληψη (λάθος) {
κονσόλα.log (σφάλμα);
res.status(500).json({ μήνυμα: 'Παρουσιάστηκε σφάλμα!' });
}
};

exports.loginUser = (req, res, επόμενο) => {
passport.authenticate('τοπικός', { συνεδρία: ψευδής }, (σφάλμα, χρήστης, πληροφορίες) => {
αν (λάθος) {
κονσόλα.log (err);

ΕΠΙΣΤΡΟΦΗ res.status(500).json({
μήνυμα: "Παρουσιάστηκε σφάλμα κατά τη σύνδεση"
});
}

αν (!χρήστης) {
ΕΠΙΣΤΡΟΦΗ res.status(401).json({
μήνυμα: "Μη έγκυρα διαπιστευτήρια σύνδεσης"
});
}

req.login (χρήστης, { συνεδρία: ψευδής }, (σφάλμα) => {
αν (λάθος) {
κονσόλα.log (err);

ΕΠΙΣΤΡΟΦΗ res.status(500).json({
μήνυμα: "Παρουσιάστηκε σφάλμα κατά τη σύνδεση"
});
}

συνθ { _id, όνομα χρήστη, ρόλος } = χρήστης;
συνθ ωφέλιμο φορτίο = { ταυτότητα χρήστη: _id, όνομα χρήστη, ρόλος };
συνθ token = generateToken (ωφέλιμο φορτίο);
res.cookie('ένδειξη', διακριτικό, { http Μόνο: αληθής });
ΕΠΙΣΤΡΟΦΗ res.status(200).json({ μήνυμα: 'Επιτυχής σύνδεση' });
});
})(απαιτ., ανταπ., επόμενο);
};

ο registerUser Η λειτουργία χειρίζεται την εγγραφή ενός νέου χρήστη εξάγοντας το όνομα χρήστη, τον κωδικό πρόσβασης και τον ρόλο από το σώμα αιτήματος. Στη συνέχεια, δημιουργεί μια καταχώρηση νέου χρήστη στη βάση δεδομένων και απαντά με ένα μήνυμα επιτυχίας ή ένα σφάλμα, εάν παρουσιαστεί κάποιο κατά τη διάρκεια της διαδικασίας.

Από την άλλη πλευρά, το loginUser Η λειτουργία διευκολύνει τη σύνδεση των χρηστών χρησιμοποιώντας την τοπική στρατηγική ελέγχου ταυτότητας που παρέχεται από το Passport.js. Πραγματοποιεί έλεγχο ταυτότητας των διαπιστευτηρίων του χρήστη και επιστρέφει ένα διακριτικό μετά την επιτυχή σύνδεση, το οποίο στη συνέχεια αποθηκεύεται σε ένα cookie για επόμενα αιτήματα ελέγχου ταυτότητας. Εάν παρουσιαστούν σφάλματα κατά τη διαδικασία σύνδεσης, θα επιστρέψει ένα κατάλληλο μήνυμα.

Τέλος, προσθέστε τον κώδικα που υλοποιεί τη λογική ανάκτησης όλων των δεδομένων των χρηστών από τη βάση δεδομένων. Θα χρησιμοποιήσουμε αυτό το τελικό σημείο ως την περιορισμένη διαδρομή για να διασφαλίσουμε ότι μόνο εξουσιοδοτημένοι χρήστες με το ρόλο του διαχειριστής μπορεί να έχει πρόσβαση σε αυτό το τελικό σημείο.

exports.getUsers = ασυγχρονισμός (απαιτ., ανταπ.) => {
δοκιμάστε {
συνθ χρήστες = αναμένω User.find({});
res.json (χρήστες);
} σύλληψη (λάθος) {
κονσόλα.log (σφάλμα);
res.status(500).json({ μήνυμα: 'Παρουσιάστηκε σφάλμα!' });
}
};

Ρυθμίστε μια τοπική στρατηγική ελέγχου ταυτότητας Passport.js

Για να ελέγξετε την ταυτότητα των χρηστών αφού δώσουν τα διαπιστευτήρια σύνδεσής τους, πρέπει να ρυθμίσετε μια τοπική στρατηγική ελέγχου ταυτότητας.

Δημιούργησε ένα νέο middleware/passport.js αρχείο στον ριζικό κατάλογο και προσθέστε τον ακόλουθο κώδικα.

συνθ Τοπική Στρατηγική = απαιτώ(«διαβατήριο-τοπικό»).Στρατηγική;
συνθ Χρήστης = απαιτώ("../models/user.model");

μονάδα μέτρησης.εξαγωγές = (διαβατήριο) => {
passport.use(
νέος ΤοπικήΣτρατηγική(ασυγχρονισμός (όνομα χρήστη, κωδικός πρόσβασης, έγινε) => {
δοκιμάστε {
συνθ χρήστης = αναμένω User.findOne({ όνομα χρήστη });

αν (!χρήστης) {
ΕΠΙΣΤΡΟΦΗ Έγινε(μηδενικό, ψευδής);
}

αν (user.password !== κωδικός πρόσβασης) {
ΕΠΙΣΤΡΟΦΗ Έγινε(μηδενικό, ψευδής);
}

ΕΠΙΣΤΡΟΦΗ Έγινε(μηδενικό, χρήστης);
} σύλληψη (λάθος) {
ΕΠΙΣΤΡΟΦΗ έγινε (σφάλμα)?
}
})
);
};

Αυτός ο κώδικας ορίζει μια τοπική στρατηγική passport.js για τον έλεγχο ταυτότητας των χρηστών με βάση το όνομα χρήστη και τον κωδικό πρόσβασης που παρέχονται.

Αρχικά, ζητά από τη βάση δεδομένων να βρει έναν χρήστη με αντίστοιχο όνομα χρήστη και στη συνέχεια προχωρά στην επικύρωση του κωδικού πρόσβασής του. Κατά συνέπεια, επιστρέφει το αντικείμενο ελέγχου ταυτότητας χρήστη εάν η διαδικασία σύνδεσης είναι επιτυχής.

Δημιουργήστε ένα JWT Verification Middleware

μεσα στην ενδιάμεσο λογισμικό κατάλογο, δημιουργήστε ένα νέο αρχείο auth.js και προσθέστε τον ακόλουθο κώδικα για να ορίσετε ένα ενδιάμεσο λογισμικό που δημιουργεί και επαληθεύει JWT.

συνθ jwt = απαιτώ('jsonwebtoken');
συνθ secretKey = διεργασία.env. ΜΥΣΤΙΚΟ ΚΛΕΙΔΙ;

συνθ generateToken = (φορτίο επί πληρωμή) => {
συνθ token = jwt.sign (ωφέλιμο φορτίο, secretKey, { λήγει σε: '1 ώρα' });
ΕΠΙΣΤΡΟΦΗ ένδειξη;
};

συνθ verifyToken = (απαιτούμενος ρόλος) =>(req, res, επόμενο) => {
συνθ token = req.cookies.token;

αν (!token) {
ΕΠΙΣΤΡΟΦΗ res.status(401).json({ μήνυμα: "Δεν παρέχεται διακριτικό" });
}

jwt.verify (token, secretKey, (err, decoded) => {
αν (λάθος) {
ΕΠΙΣΤΡΟΦΗ res.status(401).json({ μήνυμα: 'Μη έγκυρο διακριτικό' });
}

req.userId = decoded.userId;

αν (decoded.role !== requireRole) {
ΕΠΙΣΤΡΟΦΗ res.status(403).json({
μήνυμα: "Δεν έχετε την εξουσιοδότηση και τα δικαιώματα πρόσβασης σε αυτόν τον πόρο."
});
}

Επόμενο();
});
};

μονάδα μέτρησης.exports = {genereToken, verifyToken };

ο generateToken η λειτουργία δημιουργεί ένα JWT με καθορισμένο χρόνο λήξης, ενώ το verifyToken Η συνάρτηση ελέγχει εάν το διακριτικό είναι παρόν και έγκυρο. Επιπλέον, επαληθεύει επίσης ότι το αποκωδικοποιημένο διακριτικό περιέχει τον απαιτούμενο ρόλο, ουσιαστικά, διασφαλίζοντας ότι έχουν πρόσβαση μόνο οι χρήστες με τον εξουσιοδοτημένο ρόλο και τα δικαιώματα.

Για να υπογράψετε μοναδικά τα JWT, πρέπει να δημιουργήσετε ένα μοναδικό μυστικό κλειδί και να το προσθέσετε στο δικό σας .env αρχείο όπως φαίνεται παρακάτω.

SECRET_KEY="Αυτό είναι ένα δείγμα μυστικού κλειδιού."

Καθορίστε τις διαδρομές API

Στον ριζικό κατάλογο, δημιουργήστε έναν νέο φάκελο και ονομάστε τον διαδρομές. Μέσα σε αυτόν τον φάκελο, δημιουργήστε έναν νέο userRoutes.jsκαι προσθέστε τον ακόλουθο κώδικα.

συνθ εκφράζω = απαιτώ('εξπρές');
συνθ δρομολογητής = εξπρές. Router();
συνθ userControllers = απαιτώ("../controllers/userController");
συνθ { verifyToken } = απαιτώ("../middleware/auth");

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

router.get('/api/χρήστες', verifyToken('διαχειριστής'), userControllers.getUsers);

μονάδα μέτρησης.exports = δρομολογητής;

Αυτός ο κώδικας ορίζει τις διαδρομές HTTP για ένα REST API. ο χρήστες διαδρομή συγκεκριμένα, οι διακομιστές ως η προστατευμένη διαδρομή. Περιορίζοντας την πρόσβαση στους χρήστες με το διαχειριστής ρόλο, επιβάλλετε αποτελεσματικά τον έλεγχο πρόσβασης βάσει ρόλων.

Ενημερώστε το Αρχείο Κύριου Διακομιστή

Ανοιξε το δικό σου server.js αρχείο και ενημερώστε το ως εξής:

συνθ εκφράζω = απαιτώ('εξπρές');
συνθ κορς = απαιτώ('κορς');
συνθ cookieParser = απαιτώ("cookie-parser");
συνθ app = express();
συνθ λιμάνι = 5000;
απαιτώ('dotenv').config();
συνθ connectDB = απαιτώ("./utils/db");
συνθ διαβατήριο = απαιτώ('διαβατήριο');
απαιτώ('./middleware/passport')(διαβατήριο);

connectDB();

app.use (express.json());
app.use (express.urlencoded({ επεκτάθηκε: αληθής }));
app.use (cors());
app.use (cookieParser());
app.use (passport.initialize());

συνθ userRoutes = απαιτώ("./routes/userRoutes");
app.use('/', userRoutes);

app.listen (port, () => {
κονσόλα.κούτσουρο(`Ο διακομιστής λειτουργεί στη θύρα ${port}`);
});

Τέλος, ξεκινήστε τον διακομιστή ανάπτυξης για να τρέξει την εφαρμογή.

διακομιστής κόμβου.js

Αξιοποιήστε τον μηχανισμό RBAC για να βελτιώσετε τα συστήματα ελέγχου ταυτότητας σας

Η εφαρμογή ελέγχου πρόσβασης βάσει ρόλων είναι ένας αποτελεσματικός τρόπος για να βελτιώσετε την ασφάλεια των εφαρμογών σας.

Ενώ η ενσωμάτωση υπαρχουσών βιβλιοθηκών ελέγχου ταυτότητας για τη δημιουργία ενός αποτελεσματικού συστήματος RBAC είναι μια εξαιρετική προσέγγιση, η αξιοποίηση των βιβλιοθηκών RBAC για να ο ρητός καθορισμός ρόλων χρήστη και η εκχώρηση αδειών παρέχει μια ακόμα πιο ισχυρή λύση, εν τέλει, ενισχύοντας τη συνολική ασφάλεια του εφαρμογή.