メソッドを呼び出すことができる人を制限する良いルビーの方法を探しています。この例は、レール環境内で発生しますが、レールに固有のものではありません。ルビーでメソッドを呼び出すことができる人を制限する方法
私は、フォルダ内のドキュメントの検索を処理するDocumentというモデルを持っています。私はPermissionsを扱うクラスを持っているので、フォルダは許可されています。大きく簡略化された形式の権限で文書を検索するためのインタフェースを公開します。
class Permissions
def documents(folder_list)
#strip folders from folder_list user doesn't have permissions for
Document.where("folder.name in (?)", permissioned_folder_list)
end
end
は、機能的にこれが正常に動作しますが、クエリははるかに複雑この簡略化した例よりもときにRSpecのテストは悪夢です。私たちは、ドキュメントがどのように格納されるかの仕組みに関係する多くの期待に終わります。本当に私はこのようなものをもっと持っていきたいと思っています:
class Permissions
def documents(folder_list)
#strip folders from folder_list user doesn't have permissions for
Document.documents(permissioned_folder_list)
end
end
class Document
self.documents(folder_list)
Document.where("folder.name in (?)", folder_list)
end
end
これはうまく組み立てられ、テストが簡単です。というのも、これはDocument上のインターフェイスとして優れたドメインレベルのインターフェイスのように見えますが、アクセス許可を完全にバイパスするという問題です。それは非常に簡単に誰かが来て、これを使用し、完全に間違っている合理的な結果を得る。
私がしたいのは、Document :: documentsメソッドがPermissionsのインスタンス以外で呼び出されないようにすることです。権限をどこでも呼び出すことができますが、すべての複雑なクエリロジックを明確に処理するメソッドがある場合は、複雑なクエリロジックを再作成する必要がありますが、アクセスしない限り呼び出すことはできません。 。
このようなことをする慣用的なルビーの方法は何ですか?許可はユーザーのセッションに格納されているので、Documentを呼び出し、Permissionsを呼び出すのではなくPermissionsを呼び出させ、Documentを呼び出すのは面倒です。