+3

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

ロールベースのアクセス制御(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実装を構築し、アプリケーションのセキュリティを向上させることができます。

Mình hy vọng bạn thích bài viết này và học thêm được điều gì đó mới.

Donate mình một ly cafe hoặc 1 cây bút bi để mình có thêm động lực cho ra nhiều bài viết hay và chất lượng hơn trong tương lai nhé. À mà nếu bạn có bất kỳ câu hỏi nào thì đừng ngại comment hoặc liên hệ mình qua: Zalo - 0374226770 hoặc Facebook. Mình xin cảm ơn.

Momo: NGUYỄN ANH TUẤN - 0374226770

TPBank: NGUYỄN ANH TUẤN - 0374226770 (hoặc 01681423001)

image.png


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí