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