私はいくつかの複雑なルールを呼び出すようなシステムを構築しています。私はプロセスを集中化させたいと考えていました。Ruby on Railsで複雑なセキュリティルールを実装する方法
私の最も大切なアイデアは、さまざまなフィールドで許可された値のリストに対してデータベースに保存する前に、オブジェクトをチェックするために別のクラスを使用することでした。これはデータベース構造に非常に密接に結びついていますが、容易にテスト可能で、保守が容易です。ルールの
例:
- モデレータはモデレータのステータスが、管理者ではない状態でコメントを投稿することができます。
- Comments.statusだけ
- ユーザーはComments.statusのみ正常であることができ、コメント
- にモデレータ値を変更することはできません(管理者は、管理者用に予約されています)、正常またはモデレーターすることができ、Comments.displayは正常にしかできません。
- モデレーターのみが中断できますユーザは
- 制限アカウント変更することができ、多数のフィールドの
- リストアカウント
- 有料アカウントを持つユーザーのみがX、Y、Zを実行できます。
私が持っている問題は、どこにこのロジックを置くのかということです。レールのバリデーションにはそれほど複雑すぎます。ログインしたユーザーのステータスのみを見ると、これらのルールの一部を実装するのは困難または不可能です。現在のソリューションは、データベースオブジェクトとユーザーを受け入れ、アクションの実行を許可または禁止するSecurityクラスを作成することです。
私がこの行動措置に従えば、実装は厄介なものになるでしょう。今、私はこのような何かを見ている
#For every field on an object passed to Security::allow?(user, object), call this private method
def allow_helper?(user, object, field)
perm = permissions[user.rank][object.class.name][field]
if perm.is_a? Array
perm.include? object.send(field)
else
perm
これは、非常に迅速に維持する悪夢になるだろう。私が夢見てきたこの悪夢に代わるものがなければならない。私はこれをコード化する前に自分自身を止めた。
これが検証のためには複雑すぎる理由を説明すると役立つでしょう。これは明らかな答えです。 – kajaco
私は、セキュリティの検証を使用することは、混在したくないロジックを混在させることだと感じていると思います。おそらくそれは私がそれがそうであると思った問題ではないでしょう。 – epochwolf