数日前、同僚の何人かが、 Makaut Buddyというオープンソース アプリケーションに関する問題について私に相談してきました。Makaut Buddy は、私たちの大学向けに設計されたノート共有プラットフォームで、学生が主要なノート、過去の試験問題、 YouTubeチュートリアルを効率的に共有できるようにすることを目的としていました。
リソースをアップロードするためのシステムの開発には成功しましたが、許可されたユーザーだけがコンテンツをアップロードできるようにするという課題に直面しました。
以下のデモで示されているように、サインアップ後、どのユーザーでもリソースを作成できます。ユーザーがアップロードするものを規制することができず、有害または不快なコンテンツをアップロードするユーザーもいるため、大きな問題が発生しました。
当初は管理者ロールを定義し、特定の個人グループに管理者権限を付与していました。しかし、ロールの数が増えるにつれて、コードはますます複雑になり、管理が困難になりました。
RBAC の実装に加えて、リクエスト アクセス承認システムも導入しました。このシステムにより、コンテンツをアップロードしたいユーザーはまずアクセスをリクエストする必要があり、その後管理者がそれを承認または拒否できます。この追加されたセキュリティ レイヤーにより、Makaut Buddy のコンテンツの整合性を維持することができます。
この記事では、プログラミング言語としてJavaScript を使用し、フレームワークとしてNext.js を使用しました。ただし、ここで説明する概念は言語固有のものではなく、お好みのプログラミング言語で実装できます。
この記事を読み終える頃には、アプリケーションに基本的な RBAC モデルを実装する方法がわかるようになります。
それでは、早速始めましょう!
朝、学校に急いで向かうときのことを覚えていますか? 警備員が身分証明書をチェックするのは、認証の完璧な例です。警備員は、あなたがキャンパスへの入場を許可された学生であることを確認しています。しかし、それは最初のステップにすぎません。身分証明が済んだ後でも、教室に勝手に入っていけるわけではありませんよね? ここで認証が重要になります。
授業スケジュールはあなたの承認と考えてください。あなたの役割(そのクラスに登録されている学生)に基づいて、特定のエリア(教室)へのアクセスを許可します。学生(認証済み)であっても、教員ラウンジや図書館の立ち入り禁止区域に入る権限はありません。
認証と承認の違いは、「あなたは誰ですか?」と尋ねるのと、「あなたは何をすることが許可されていますか?」と尋ねるのに似ています。
承認は、個人が権限のないアクションを実行するのを防ぐため、あらゆる組織にとって重要です。これにより、組織の安全が確保され、損失を防ぐことができます。
上記の説明を例で説明してみましょう。
企業には、経験豊富なシニア エンジニアと、まだ仕事のやり方を学んでいるインターンがいます。シニア エンジニアとインターンの両方に同じレベルの権限が与えられていたら、どんな惨事になるかは想像に難くありません。まだ学んでいるインターンは、知らないうちにミスを犯し、会社が代償を払わなければならないかもしれません。このような状況では、権限が個人に割り当てられるのではなく、役割に割り当てられるため、役割ベースのアクセス制御モデルが最も効果的です。たとえば、シニア エンジニアまたは技術リーダーだけがリソースを削除できますが、インターン全員ができるのはリソースの表示と管理だけです。
次に、アプリケーションに RBAC を実装する方法を見てみましょう。
まず、ロールを定義し、各ロールに権限を割り当てる必要があります。
注: ロールとは、組織内での役職または目的のことです。ロールに割り当てられた権限または特権に基づいて個人を区別できるように、ロールが必要です。
アプリケーションの各ユーザーにロールを割り当てる方法が必要です。これは通常、ユーザーがサインアップした後に行われます。
バックエンドには、ユーザーが実行したい操作を受け取り、ユーザーの権限を確認する API が必要です。以下の図を見ると、理解しやすくなります。
ただし、モデル全体をゼロから実装するわけではありません。代わりに、Permit と呼ばれるサードパーティの認証ツールを使用します。これにより、認証を確立するプロセス全体が非常にスムーズかつ効率的になり、本当に重要な機能に取り組むことができます。
以下の図は、Permit を活用してアプリケーションに RBAC を実装する方法を示しています。
このセクションでは、Permit を使用してロールベースのアクセス制御 (RBAC) を実装する手順について説明します。
RBAC モデルを確立するために Permit を使用しているため、まず Permit アカウントとワークスペースを作成する必要があります。
ここで、アプリケーション内でアクセスを制御するエンティティであるリソースを作成する必要があります。
たとえば、メモを取るアプリケーションでは、リソースは Notes になり、アクションはCreate 、 Read 、 Update 、 Delete になります。
リソースを作成するには:
上記の例では、リソース名は Notes であり、ユーザーが実行できるアクションは作成、読み取り、更新、および削除です。
リソースを作成したら、アプリケーション内に存在するロールを定義する必要があります。
この場合、アプリケーションは大学向けのノート共有アプリケーションなので、役割は次のようになります。
両方のロールを作成したら、次に示すように、ポリシー エディターから各ロールが実行できるアクションを割り当てる必要があります。
Permit アカウントが設定されたので、Permit と通信するためのバックエンド API の作成を開始できます。Permit が提供する Node.js SDK を使用します。希望するプログラミング言語の SDK は、Permit ドキュメントで見つけることができます。
ユーザーを同期し、デフォルトロールを割り当てる
まず、アプリケーションにサインアップする各ユーザーが許可ディレクトリに同期され、デフォルトのロール「学生」が割り当てられていることを確認する必要があります。
これを行うには、以下に示すようにバックエンド API を作成する必要があります。
この API は次の 2 つのことを行います。
createUser
API を使用して新しいユーザーを作成します。assignRole
API を使用してデフォルトのロールを割り当てます。
Permitが提供するすべてのAPIの詳細については、 permit docsをご覧ください。
ユーザーロールの取得
次に、 Permit.ioからユーザーのロールを取得してフロントエンドに送り返すバックエンド API を作成する必要があります。
以下に示すAPIはpermit.api.users.get(user_key)
を使用してユーザーを取得します。
この API は、フロントエンド コンポーネントを操作して、特別な役割を持つユーザーだけがそれを表示できるようにするユーザー ロールを取得します。
また、 permit.check()関数を使用して、特定のロールを持つユーザーが操作を実行することを許可されているかどうかを確認することもできます。
これで、Permit を使用して RBAC モデルを正常に実装できました。これで、バックエンド ルートを任意のフロントエンド フレームワークまたはライブラリと統合して、セットアップを完了できます。
セットアップを完了するには、ユーザーがロールのアップグレードをリクエストできるコンポーネントが必要です。
Permit Elements は、アプリケーションでのアクセス共有を簡単にする、組み込み済みの埋め込み可能な UI コンポーネント スイートである「Permit Share-If」の一部です。完全に機能するアクセス制御を提供するように設計されており、ユーザーへの権限管理の委任をシンプルかつ安全に行うことができます。
これで要素が作成されました。
要素を使用する前に、ユーザーを許可要素にログインするためのバックエンドAPIを作成する必要があります。
注: できるだけ早く、できればサインアップ直後にユーザーをログインさせることが重要です。
さて、コードを見てみましょう:
エンドポイント/api/v1/login_permit/?userkey=user_key
で提供される API コード:
ログインを実装するためのフロントエンド コードは次のようになります。
これでコードの設定は完了です。
ここで、許可ダッシュボードに移動し、以下に示すように、ユーザー管理 iframe とアクセス要求 iframe の両方をコピーする必要があります。
コードを入手したら、ユーザーに要素を表示したいフロントエンドにiframe
を追加する必要があります。そのためには次のことが必要です。
これにより、ユーザーがロールのアップグレードをリクエストし、管理者がこれらのリクエストを承認または拒否できるアクセス承認システムを正常に設定できました。
このデモでは、「管理者」ロールを持つユーザーがアップロードウィジェットにアクセスする方法を示します。
このデモでは、「学生」ロールを持つユーザーがアップロード ウィジェットを表示できず、「管理者」ロールへのアップグレードをリクエストできる方法を示します。
このデモでは、特権ユーザーがロールのアップグレード要求を承認する方法を示します。
このデモでは、ユーザーが「学生」から「管理者」にアップグレードされた後、アップロードウィジェットにアクセスする方法を説明します。
それでおしまい!
ここまで読んでいただきありがとうございました。
このチュートリアルでは、承認について説明し、承認があらゆるアプリケーションで非常に重要である理由を理解しました。また、Permit を設定および構成してアプリケーションを保護し、ユーザーの役割に基づいてユーザー アクセスを制御する方法についても説明しました。
この記事は、承認と RBAC モデルのほんの一角にすぎません。より詳細な承認については、ABAC と ReBAC を参照してください。