2017-02-27 9 views
1

私は、Elixirに付属しているNodeで動作する余分な複雑さのため、Node.jsで書いたアプリケーションをElixirに書き直すことにしましたボックス。エリクシールチャンネル/ソケットでの認証/許可の処理におけるアーキテクチャー/技術的課題

私の問題は、私がNodeでかなり正しいとは思っていなかったし、Elixirでも同様に複雑になってきています。私はそれに近づく方法を完全にはわかりません。

私はDiscordがどのようにパーミッションを行うのかを再現しようとしています。私は本質的に "セールスマネージャー"、 "セールス"、 "カスタマーサービス担当者"などの異なる役割を持つCRMシステムを構築しています...しかし、彼らはすべて自分の "役割"に基づいて異なることをすることができます。

私がする必要があることは、人や役割のためにオンザフライでアクセス許可を更新できることです。たぶん「セールスマネージャー」の役割は、「会計士」のような会社の財務データを見ることはできませんが、その特定の人に数日間アクセスさせる必要があります。または、私は「カスタマーサービス担当者」を持っており、その役割全体にカレンダーに物を追加する機能を与えます。私もセッションを殺す能力を持っていたいと思います。

だから、そこのような、私はエリクシールフォーラムの周りに言った見てきたいくつかの方法、されています

ガーディアンを使用して
  • が、私は本当にトークンを好きにしたいとデータベースをヒットする必要がないと思うたびに素敵に聞こえるが、私はそれが実用的だとは思わない。私が見つけていない飛行中にトークンを更新する良い解決策がない限り。
  • 各自に独自のプロセスを与え、新しい変更が加えられた変更に対してプロセスを強制終了して開始するだけです。これはかなりきれいだと思われますが、実際のエラーがなければプロセスを殺すのではなく、問題解決のような大きな問題がこのソリューションにはあると思います。私はこれが実際に問題を引き起こすかどうか、またはこれが他の理由では悪い解決策であるかどうかを知るには十分に精通していませんが。
  • GuardianをGuardian_DBと併用すると、トークンを使用する目的が無効になりますが、少なくともトラッキング可能なセッションがあります。私の唯一の問題は、ロードバランサを使用してソケット接続が切断された場合、そのソケットを同じサーバーに再接続できるようにすることです。トークンを使用する方法があるかどうか、またはソケット自体にそれに付随するセッション。これは本当に大きな問題ではありませんし、Node.jsにあったものにかなり近いです。
  • 私が離れていたいRedisを使用して、更新が発生したときにuser_idに基づいてRedisのセッションデータを更新し、すべての要求に対してRedisを押して、そのユーザーに権限があるかどうかを確認します。私はこれを複数のサーバに配置するつもりです。つまり、Node.jsのようにソケット接続の負荷を分散できない限り、ETSは実行できません。

だから私は

  • 私はソケットにセッションを添付することができ、私の質問があると思いますか?これは悪い考えですか?
  • まだトークンを使用する必要があります。すべての要求でトークンを確認するためにRedisを使用するだけですか?
  • トークンはまだセッションよりも優れた選択肢ですか?
  • 私が言及していないはるかに優れた/簡単な解決策がありますか?

申し訳ありませんが、私はこのプロジェクトとして拘束された許可を何もする必要はありませんでした。エリクサーにとってはかなり新しいことです。

答えて

1

フェニックスチャンネルはステートフルです。assignsフィールドにデータを置くことができ、接続の間、そこにとどまります。これは通常、ユーザをjoinに認証した後にuser_idを置く場所です。

私はチャンネルの割り当てを使用して、必要なクライアントの状態をサーバーに保存します。

権限へのロールへのWRT質問、私はまさにこれをやっています。私がやることは、起動時にデータベースから役割の権限を読み込み、ETSストアを構築することです。タスクやGenServerでも同じことができます。特定のロールの権限が変更された場合、私はデータベースとETSテーブルを更新します。

私のユーザーモデルは、各ユーザーの役割の一覧をサポートしています。

特定のユーザーのアクセス許可を検証する必要がある場合は、Permission.has_permission?("create-room", user, scope)のようなアクセス許可モデルapiを呼び出します。私は2つのレベルの許可を持っています。それがスコープの用途です。

+0

私はETSテーブルがその特定のマシンでのみ動作することを知っています。私はおそらくそれらを配布する必要はありませんが、私は私がETSテーブルでそれを行うことはできません知っている。 Mnesiaのようなものが答えでしょうか? –

関連する問題