パーミッション述語を提案するのに適切な場所は?

Restrict exposure of full name to certain groups の解決策を提案するにあたり、(サーバーサイドの) パーミッション述語を定義したいと思います。この述語は、「現在のユーザー範囲/コンテキストに基づいて、(他の) ユーザーのフルネームを明らかにしてもよいか?」という質問に答えます。

(範囲は、クライアントリクエストによって設定されるか、ダイジェストメールメッセージの生成のような内部処理ステップによって設定される可能性があります。)

このような述語に適切な構成は何ですか? コードベースのどこに配置すべきですか? おそらくこれはガーディアンに属するのではないかと考えていますが、それは正しい方向でしょうか? どのガーディアンが良いでしょうか?

この新しい述語は、コードベース内の SiteSettings.enable_names? の多くのインスタンス (すべてではありませんが) を包含すると想像しています。( user.name を返すシリアライザーにヒットさせることが、データの漏洩のほとんどを防ぎますが、完全ではありません。) これによる nice な利点は、将来のプラグインが動作を変更できる拡張ポイントを導入することです (現在のところ可能ではないようです。そうでなければ、それを実行するだけです!)。したがって、これを機能させることができれば、これはディスコースコアへのプルリクエストになります。そして、受け入れられる可能性のある PR を提出したいと思います。

「いいね!」 1

学んだこと/推測したことは以下の通りです。

  • Guardian はまさに 「ユーザーは何を許可されているか?」 をカプセル化するものです。(Guardian インスタンスは User インスタンスも保持します。)
  • したがって、権限述語の適切な場所は、単に Guardian のメソッド(lib/guardian.rb)にあります。
    • メソッドが「ユーザーは Xxxx オブジェクトに対して Z を実行できますか?」というものである場合、それはおそらく XxxxGuardian ミキシンファイル(lib/guardian/...)のいずれかに属します。
    • それ以外の場合は、基本の Guardian 定義に入ります。
  • ApplicationController は現在のリクエスト/クライアントを反映する guardian 属性を管理し、シリアライザーにスコープとして提供するため、必要に応じて現在の Guardian が利用可能になります(利用できない場合を除く[1])。
  • Guardian がすぐに利用できない場所があります。通常はシステムによって実行されるバックエンドタスクですが、「アクティブなユーザー」(例:メール通知の生成時に受信者ユーザー)のハンドルがあれば、適切なガーディアンをその場で作成できます: Guardian.new(the_user)

  1. ↩︎