Bu teknolojileri pratik bir gösterimle nasıl birleştireceğinizi öğrenin.

Rol tabanlı erişim kontrolü, güvenli bir kimlik doğrulama mekanizmasıdır. Belirli rollere sahip kullanıcılarla belirli kaynaklara erişimi kısıtlamak için kullanabilirsiniz.

Bu tür kimlik doğrulama, sistem yöneticilerinin izinleri kullanıcıların belirlenmiş rollerine göre kontrol etmesine yardımcı olur. Bu ayrıntılı kontrol düzeyi, uygulamaların yetkisiz erişimi engellemesine izin vererek bir güvenlik katmanı ekler.

Passport.js ve JWT'leri Kullanarak Rol Tabanlı Erişim Kontrol Mekanizmasını Uygulama

Rol tabanlı erişim kontrolü (RBAC), kullanıcı rollerine ve izinlerine dayalı uygulamalarda erişim kısıtlamalarını zorlamak için kullanılan popüler bir mekanizmadır. RBAC mekanizmasını uygulamak için çeşitli yöntemler mevcuttur.

İki popüler yaklaşım, aşağıdakiler gibi özel RBAC kitaplıklarının kullanılmasını içerir: Erişim Kontrolü veya mekanizmayı uygulamak için mevcut kimlik doğrulama kitaplıklarından yararlanmak.

Bu durumda, JSON Web Simgeleri (JWT'ler), kimlik doğrulama bilgilerini iletmek için güvenli bir yol sağlar. Passport.js, esnek kimlik doğrulama sağlayarak kimlik doğrulama sürecini basitleştirir ara yazılım.

instagram viewer

Bu yaklaşımı kullanarak, kullanıcılara roller atayabilir ve kimlik doğrulaması yaptıklarında bunları JWT'de kodlayabilirsiniz. Daha sonra JWT'yi, sonraki isteklerde kullanıcının kimliğini ve rollerini doğrulamak için kullanabilirsiniz, bu da rol tabanlı yetkilendirme ve erişim kontrolü sağlar.

Her iki yaklaşımın da avantajları vardır ve RBAC'ın uygulanmasında etkili olabilir. Hangi yöntemin uygulanacağı, projenizin özel gereksinimlerine bağlı olacaktır.

Bu projenin kodunu adresinden indirebilirsiniz. GitHub deposu.

Bir Express.js Projesi Kurun

Başlamak, yerel olarak bir Express.js projesi kurun. Projeyi kurduktan sonra devam edin ve şu paketleri kurun:

npm kurulum kors dotenv firavun faresi çerez ayrıştırıcı jsonwebtoken mongodb \
pasaport yerel pasaport

Sonraki, bir MongoDB veritabanı oluşturun veya MongoDB Atlas'ta bir küme kurma. Veritabanı bağlantı URI'sini kopyalayın ve bir .env projenizin projenizin kök dizinindeki dosya:

CONNECTION_URI="bağlantı URI'si"

Veritabanı Bağlantısını Yapılandırma

Kök dizinde yeni bir tane oluşturun. araçlar/db.js dosyasını açın ve Mongoose kullanarak Atlas üzerinde çalışan MongoDB kümesine bağlantı kurmak için aşağıdaki kodu ekleyin.

sabit firavun faresi = gerekmek('firavun faresi');

sabit bağlantıDB = zaman uyumsuz () => {
denemek {
beklemek firavun faresi.connect (işlem.env. CONNECTION_URI);
konsol.kayıt("MongoDB'ye bağlandı!");
} yakalamak (hata) {
konsol.hata("MongoDB'ye bağlanırken hata oluştu:", hata);
}
};

modül.exports = connectDB;

Veri Modelini Tanımlayın

Kök dizinde yeni bir tane oluşturun. model/user.model.js dosyasını açın ve Mongoose kullanan kullanıcıların verileri için bir veri modeli tanımlamak üzere aşağıdaki kodu ekleyin.

sabit firavun faresi = gerekmek('firavun faresi');

sabit kullanıcı Şeması = yeni firavun faresi Şema({
Kullanıcı adı: Sicim,
şifre: Sicim,
rol: Sicim
});

modül.exports = firavun faresi.model("Kullanıcı", kullanıcı Şeması);

API Uç Noktaları için Denetleyici Oluşturma

Yeni bir tane oluştur controllers/user.controller.js dosyasını kök dizine kopyalayın ve aşağıdaki kodu ekleyin.

İlk olarak, şu içe aktarmaları yapın:

sabit kullanıcı = gerekmek('../modeller/kullanıcı.model');
sabit pasaport = gerekmek('pasaport');
sabit { jeton oluştur } = gerekmek('../ara yazılım/auth');
gerekmek('../ara yazılım/pasaport')(pasaport);

Ardından, kullanıcı kaydını ve oturum açma işlevini yönetmek için mantığı tanımlayın:

export.registerUser = zaman uyumsuz (gerekli, res) => {
sabit { username, password, role } = req.body;

denemek {
beklemek User.create({ kullanıcı adı, şifre, rol });
res.status(201).json({ İleti: "Kullanıcı başarıyla kaydedildi" });
} yakalamak (hata) {
konsol.log (hata);
res.status(500).json({ İleti: 'Bir hata oluştu!' });
}
};

export.loginUser = (talep, res, sonraki) => {
pasaport.doğrulama('yerel', { oturum: YANLIŞ }, (hata, kullanıcı, bilgi) => {
eğer (hata) {
konsol.log (hata);

geri dönmek res.status(500).json({
İleti: 'Giriş yapılırken bir hata oluştu'
});
}

eğer (!kullanıcı) {
geri dönmek res.status(401).json({
İleti: 'Geçersiz giriş bilgileri'
});
}

req.login (kullanıcı, { oturum: YANLIŞ }, (hata) => {
eğer (hata) {
konsol.log (hata);

geri dönmek res.status(500).json({
İleti: 'Giriş yapılırken bir hata oluştu'
});
}

sabit { _id, kullanıcı adı, rol } = kullanıcı;
sabit yük = { Kullanıcı kimliği: _id, kullanıcı adı, rol};
sabit belirteç = oluşturToken (yük);
res.cookie('jeton', jeton, { httpYalnızca: doğru });
geri dönmek res.status(200).json({ İleti: 'Giriş başarılı' });
});
})(req, res, sonraki);
};

bu kayıt kullanıcı işlev, istek gövdesinden kullanıcı adını, parolayı ve rolü çıkararak yeni bir kullanıcının kaydını işler. Daha sonra veritabanında yeni bir kullanıcı girişi oluşturur ve işlem sırasında herhangi bir hata oluşursa bir başarı mesajı veya bir hata ile yanıt verir.

Öte yandan, oturum açmaKullanıcı işlevi, Passport.js tarafından sağlanan yerel kimlik doğrulama stratejisini kullanarak kullanıcı oturumunu kolaylaştırır. Kullanıcının kimlik bilgilerini doğrular ve başarılı oturum açma üzerine bir belirteç döndürür; bu, daha sonra kimliği doğrulanmış istekler için bir tanımlama bilgisinde saklanır. Oturum açma işlemi sırasında herhangi bir hata oluşursa, uygun bir mesaj döndürür.

Son olarak, tüm kullanıcıların verilerini veritabanından getiren mantığı uygulayan kodu ekleyin. Yalnızca rolü olan yetkili kullanıcıların çalışmasını sağlamak için bu uç noktayı kısıtlı rota olarak kullanacağız. yönetici bu uç noktaya erişebilir.

export.getUsers = zaman uyumsuz (gerekli, res) => {
denemek {
sabit kullanıcılar = beklemek Kullanıcı.bul({});
res.json (kullanıcılar);
} yakalamak (hata) {
konsol.log (hata);
res.status(500).json({ İleti: 'Bir hata oluştu!' });
}
};

Bir Passport.js Yerel Kimlik Doğrulama Stratejisi Ayarlayın

Oturum açma kimlik bilgilerini sağladıktan sonra kullanıcıların kimliğini doğrulamak için yerel bir kimlik doğrulama stratejisi oluşturmanız gerekir.

Yeni bir tane oluştur ara yazılım/passport.js dosyasını kök dizine kopyalayın ve aşağıdaki kodu ekleyin.

sabit Yerel Strateji = gerekmek('pasaport-yerel').Strateji;
sabit kullanıcı = gerekmek('../modeller/kullanıcı.model');

modül.ihracat = (pasaport) => {
pasaport.kullanım(
yeni YerelStrateji(zaman uyumsuz (kullanıcı adı, şifre, tamam) => {
denemek {
sabit kullanıcı = beklemek User.findOne({ kullanıcı adı });

eğer (!kullanıcı) {
geri dönmek Tamamlandı(hükümsüz, YANLIŞ);
}

eğer (user.password !== şifre) {
geri dönmek Tamamlandı(hükümsüz, YANLIŞ);
}

geri dönmek Tamamlandı(hükümsüz, kullanıcı);
} yakalamak (hata) {
geri dönmek bitti (hata);
}
})
);
};

Bu kod, sağlanan kullanıcı adı ve parolaya göre kullanıcıların kimliğini doğrulamak için yerel bir pasaport.js stratejisi tanımlar.

İlk başta, eşleşen bir kullanıcı adına sahip bir kullanıcı bulmak için veritabanını sorgular ve ardından şifrelerini doğrulamaya devam eder. Sonuç olarak, oturum açma işlemi başarılı olursa kimliği doğrulanmış kullanıcı nesnesini döndürür.

Bir JWT Doğrulama Ara Yazılımı Oluşturun

İçinde ara yazılım dizini, yeni bir auth.js dosyası oluşturun ve JWT'leri oluşturan ve doğrulayan bir ara yazılım tanımlamak için aşağıdaki kodu ekleyin.

sabit jwt = gerekmek("jsonwebtoken");
sabit gizliAnahtar = işlem.env. GİZLİ ANAHTAR;

sabit oluşturToken = (yük) => {
sabit belirteç = jwt.sign (yük, gizliKey, { içinde sona eriyor: "1sa" });
geri dönmek jeton;
};

sabit doğrulamaToken = (gerekliRol) =>(talep, res, sonraki) => {
sabit belirteç = talep.cookies.token;

eğer (!jeton) {
geri dönmek res.status(401).json({ İleti: 'Belirteç sağlanmadı' });
}

jwt.verify (token, secretKey, (err, decoded) => {
eğer (hata) {
geri dönmek res.status(401).json({ İleti: 'Geçersiz belirteç' });
}

req.userId = kodu çözülmüş.userId;

eğer (decoded.role !== gerekliRole) {
geri dönmek res.status(403).json({
İleti: 'Bu kaynağa erişim yetkiniz ve izinleriniz yok.'
});
}

Sonraki();
});
};

modül.exports = {üretmeToken, doğrulamaToken};

bu Oluşturmak işlevi, belirli bir sona erme süresi olan bir JWT oluştururken, doğrulamaToken işlev, belirtecin mevcut ve geçerli olup olmadığını kontrol eder. Ek olarak, kodu çözülmüş jetonun gerekli rolü içerdiğini de doğrular ve esasen yalnızca yetkili role ve izinlere sahip kullanıcıların erişime sahip olmasını sağlar.

JWT'leri benzersiz bir şekilde imzalamak için benzersiz bir gizli anahtar oluşturmanız ve bunu JWT'nize eklemeniz gerekir. .env aşağıda gösterildiği gibi dosya.

SECRET_KEY="Bu örnek bir gizli anahtardır."

API Yollarını Tanımlayın

Kök dizinde yeni bir klasör oluşturun ve buna rotalar adını verin. Bu klasörün içinde yeni bir tane oluşturun. kullanıcıRoutes.js, ve aşağıdaki kodu ekleyin.

sabit ifade = gerekmek('ifade etmek');
sabit yönlendirici = ekspres. Yönlendirici();
sabit userControllers = gerekmek('../denetleyiciler/kullanıcıDenetleyici');
sabit { doğrulamaToken } = gerekmek('../ara yazılım/auth');

yönlendirici.post("/api/kayıt", userControllers.registerUser);
yönlendirici.post('/api/giriş', userControllers.loginUser);

yönlendirici.get("/api/kullanıcılar", doğrulamaToken("yönetici"), userControllers.getUsers);

modül.export = yönlendirici;

Bu kod, bir REST API için HTTP yollarını tanımlar. bu kullanıcılar özellikle rota, korumalı rota olarak sunucular. ile kullanıcılara erişimi sınırlayarak yönetici rol tabanlı erişim denetimini etkili bir şekilde uygularsınız.

Ana Sunucu Dosyasını Güncelleyin

aç senin sunucu.js dosyasını açın ve aşağıdaki gibi güncelleyin:

sabit ifade = gerekmek('ifade etmek');
sabit korlar = gerekmek('kors');
sabit çerezParser = gerekmek('çerez ayrıştırıcı');
sabit uygulama = ekspres();
sabit bağlantı noktası = 5000;
gerekmek('dotenv').config();
sabit bağlantıDB = gerekmek('./utils/db');
sabit pasaport = gerekmek('pasaport');
gerekmek('./ara yazılım/pasaport')(pasaport);

connectDB();

app.use (express.json());
app.use (express.urlencoded({ uzatılmış: doğru }));
app.use (kors());
app.use (cookieParser());
app.use (passport.initialize());

sabit kullanıcıYolları = gerekmek('./routes/userRoutes');
uygulama.kullan('/', kullanıcıRoutes);

app.listen (bağlantı noktası, () => {
konsol.kayıt(`Sunucu bağlantı noktasında çalışıyor ${bağlantı noktası}`);
});

Son olarak, uygulamayı çalıştırmak için geliştirme sunucusunu başlatın.

düğüm sunucusu.js

Kimlik Doğrulama Sistemlerinizi Yükseltmek için RBAC Mekanizmasından Yararlanın

Rol tabanlı erişim denetimi uygulamak, uygulamalarınızın güvenliğini artırmanın etkili bir yoludur.

Verimli bir RBAC sistemi oluşturmak için mevcut kimlik doğrulama kitaplıklarını dahil etmek harika bir yaklaşım olsa da, RBAC kitaplıklarından yararlanarak kullanıcı rollerini açıkça tanımlayın ve izinleri atayın, daha da sağlam bir çözüm sağlar ve sonuç olarak genel güvenliğinizi artırır. başvuru.