- vừa được xem lúc

Blog#207: 🔐Node.js Expressでのロールベースのアクセス制御(RBAC)の実装

0 0 6

Người đăng: NGUYỄN ANH TUẤN

Theo Viblo Asia

207

こんにちは、私はトゥアンと申します。東京からフルスタックWeb開発者です。 将来の有用で面白い記事を見逃さないように、私のブログをフォローしてください。😊

ロールベースのアクセス制御(RBAC)は、現代のウェブアプリケーションにおいて重要なセキュリティ機能です。それは、ユーザーの役割に応じて異なるアクセスレベルを提供することで、機密データや機能を保護します。本記事では、Node.js ExpressアプリケーションでRBACを実装する方法について詳しく説明します。

RBACの紹介

RBACは、ユーザーの役割に基づいてリソースとアクションへのアクセスを制限するセキュリティモデルです。ユーザー権限の管理を個々のユーザーから切り離すことで、アプリケーションの維持とスケーリングが容易になります。ユーザーに役割を割り当てることで、アプリケーション内で特定のリソースにアクセスし、特定のアクションを実行できるユーザーを制御できます。

プロジェクトの設定

まず、新しいNode.js Expressプロジェクトを設定しましょう。

$ mkdir rbac-node-express
$ cd rbac-node-express
$ npm init -y
$ npm install express body-parser mongoose
$ npm install --save-dev nodemon

環境変数を格納する.envファイルを作成し、次の内容を含めます。

PORT=3000
MONGODB_URI=mongodb://localhost:27017/rbac-node-express

package.jsonファイルを更新して、次のスクリプトを含めます。

{ ... "scripts": { "start": "nodemon index.js" }, ...
}

次に、次のコードを含むindex.jsファイルを作成します。

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
dotenv.config(); const app = express();
app.use(bodyParser.json()); mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true,
}).then(() => console.log('Connected to MongoDB')); app.listen(process.env.PORT, () => { console.log(`Server running at http://localhost:${process.env.PORT}`);
});

役割と権限の作成

まず、アプリケーションの役割と権限を定義しましょう。roles.jsファイルを作成し、次の内容を含めます。

const roles = { admin: { can: [ 'read', 'write', 'delete', ], }, editor: { can: [ 'read', 'write', ], }, viewer: { can: [ 'read', ], },
}; module.exports = roles;

ここでは、admineditorviewerという3つの異なる権限を持つ役割を定義しました。

ロールベースの認証のためのミドルウェアの定義

次に、特定のルートへのアクセスに必要な役割を持っているかどうかをチェックするミドルウェア関数を作成します。新しいファイルroleMiddleware.jsを作成し、次のコードを追加します。

const roles = require('./roles'); const checkRole = (requiredRole) => (req, res, next) => { const userRole = req.user.role; if (!roles[userRole].can.includes(requiredRole)) { return res.status(403).send('Forbidden'); } next();
};
module.exports = checkRole;

このコードでは、先ほど定義した役割をインポートし、必要な役割を引数として取るcheckRole関数を作成します。ミドルウェア関数は、ユーザーの役割が必要な権限を含んでいるかどうかをチェックし、含んでいない場合は403 Forbiddenステータスを返します。それ以外の場合は、次のミドルウェアまたはルートハンドラに進みます。

ルートでのRBACの実装

ミドルウェア関数ができたので、アプリケーションのルートでRBACを実装し始めることができます。まず、user.jsファイルを作成して、サンプルユーザーオブジェクトを定義します。

const user = { name: 'John Doe', role: 'admin', // 役割をテストするためにこの値を変更します
}; module.exports = user;

次に、index.jsファイルを更新して、次のコードを含めます。

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const checkRole = require('./roleMiddleware');
const user = require('./user'); dotenv.config(); const app = express();
app.use(bodyParser.json()); // ユーザー認証をシミュレートしてリクエストにユーザーオブジェクトを追加するミドルウェア
app.use((req, res, next) => { req.user = user; next();
}); mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true,
}).then(() => console.log('Connected to MongoDB')); // RBACミドルウェアを使用してルートを定義する
app.get('/dashboard', checkRole('read'), (req, res) => { res.send('ダッシュボードへようこそ');
}); app.post('/create-post', checkRole('write'), (req, res) => { res.send('投稿が作成されました');
}); app.delete('/delete-post', checkRole('delete'), (req, res) => { res.send('投稿が削除されました');
}); app.listen(process.env.PORT, () => { console.log(`Server running at http://localhost:${process.env.PORT}`);
});

ここでは、リクエストにユーザーオブジェクトを追加してユーザー認証をシミュレートするミドルウェアを追加しました。また、checkRoleミドルウェアを使用して、異なる権限を持つ3つのルート(/dashboard/create-post/delete-post)を定義しました。

実装のテスト

Postmancurlなどのツールを使って、RBACの実装をテストすることができます。異なるルートにリクエストを送信し、レスポンスを確認します。ユーザーの役割が必要な権限を含んでいる場合は、成功メッセージが表示されます。それ以外の場合は、403 Forbiddenステータスが表示されます。

例えば、curlを使って/dashboardルートをテストすることができます。

$ curl -X GET http://localhost:3000/dashboard

結論

この記事では、Node.js Expressアプリケーションでロールベースのアクセス制御(RBAC)を実装する方法を説明しました。役割と権限を定義し、ロールベースの認証を強制するミドルウェア関数を作成し、アプリケーションのルートに適用しました。この実装により、ユーザーは割り当てられた役割に基づいてリソースにアクセスし、アクションを実行できるようになり、ウェブアプリケーションのセキュリティが向上します。このRBACの実装は、アプリケーションの保護とユーザーアクセスの制御に役立ちます。また、役割と権限を柔軟に設定することで、アプリケーションの成長とともにアクセス制御を容易に調整することができます。

今回の記事で紹介した実装方法は、Node.js ExpressアプリケーションでのRBACの基本的な実装方法ですが、実際のプロジェクトでは、認証やデータベースとの連携など、さらに多くの要素が絡んでくることがあります。それでも、この記事で紹介した方法を基本にして、独自のRBAC実装を構築し、アプリケーションのセキュリティを向上させることができます。

最後

いつもお世話になっています。この記事を楽しんで、新しいことを学べたら嬉しいです。😊

今度の記事でお会いしましょう!この記事が気に入ったら、私を応援するために「LIKE」を押して登録してください。ありがとうございました。

Ref

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cách mình "hack" được vào hẹ thống của SMAS để xem điểm.

Cách mà mình "hack" được vào hệ thống của SMAS. Thật ra dùng từ hack cũng không đúng lắm, chỉ là một vài trick để lừa hệ thống mà thôi.

0 0 145

- vừa được xem lúc

[NodeJs] Tạo QR Code trong nodeJs với qrcode

Tạo mã QR Code trong nodejs với qrcode. QR Code là gì. Tạo QR code với qrcode. Cài đặt thư viện qrcode.

0 0 34

- vừa được xem lúc

Áp dụng kiến trúc 3 Layer Architecture vào project NodeJS

The problem encountered. Các framework nodejs phổ biết như Express cho phép chúng ta dễ dàng tạo ra Resful API xử lí các request từ phía client một cách nhanh chóng và linh hoạt.

0 0 80

- vừa được xem lúc

Router, Controller trong Express

Mở đầu. Xin chào các bạn mình đã quay trở lại rồi đây, tiếp tục với series Nodejs cơ bản thì hôm nay mình sẽ giới thiệu đến các bạn Express Router và Controller.

0 0 40

- vừa được xem lúc

Xây dựng CRUD RESTful API sử dụng Node, Express, MongoDB.

Introduction. Trong phạm vi bài viết này chúng ta sẽ cùng tìm hiểu về cách tạo restful api với Node, Express và MongoDB. . Xử lý các hoạt động crud.

0 0 225

- vừa được xem lúc

Rate time limit trong NodeJS

Chào các bạn, lại là mình đây. Hôm nay mình xin giới thiệu tới các bạn một kỹ thuật rất hay ho và hữu ích đó là Rate Limiting. 1. Rate Limiting là gì.

0 0 62