2011-12-03 15 views
0

このアプリケーションはRuby on Railsで書かれていますが、私が直面している問題は言語関連のものよりもデザイン上の問題です。ユーザ認証デザインは、ユーザですか?

システムは、レジストリを維持するために多くのユーザにサービスを提供します。それは人と物を関連づけています。このように、所有者を表すPersonというモデルがあり、レジストリを管理する人を表すUserというモデルがあります。

これで、元のデザインでは不要だった個人の詳細を人がログインして変更できるようにする新しい要件が生まれました。

問題は、この新しい要件を満たすためにアプリケーションをリファクタリングする方法ですか?

簡単な解決策の1つは、ログイン資格情報を要求し、ユーザーと個人エンティティをリンクする人物ごとにユーザーを作成することですが、firstname、surnameなどのいくつかのフィールドは両方のクラスにあり、特にDRYではありません。正確にデータの人々は変更することができます。 UserとPersonは別々のテーブルに格納されています。

私が考えていたもう1つの可能性は、もう一方を拡張することですが、分離した表にデータを置くと、少し面倒です。さらに、論理的な拡張はユーザ<になります - ユーザとしての人は(一般的に)人ですが、実装について考えている人< - ユーザはかなり簡単です。

一つの最後のオプションは、ユーザーをスクラップしてログインするだけで、ログインこれらのフィールドの半分は空ではありません人のための空のログオンフィールドを離れる人へのログイン資格情報を移動することができます。

あなたは考えることができますより良い解決策?

答えて

1

アプリケーションをボトムアップで書いて、それとあなたの現在のセットアップとの間で妥協する方法を考え出すなら、これが理想的にどのように機能すべきか考えることができます。ここにいくつかの一般的な入力があります。

認証には認証が必要な「ID」が必要です。これは、例えば、電子メールアドレスとそれに関連するパスワードを電子メールで確認します。

アイデンティティは複数の「ロール」に関連付けられる可能性があり、アイデンティティで認証された誰かがどのロールを実行するかを選択できます。 「私は現在管理者です」と「私は現在正規のサイトユーザーです」というロールが、ログインしたIDに対するユーザーの現在の権限を定義します。また、複雑さが必要ない場合は、アイデンティティが(単一の)役割であると言えます。

可能な「権利」とユーザーが実行している役割の間に何らかのトラッキングが必要です。例えば。最も単純な設定は、アイデンティティまたはロールになります。いくつかのブール型のcan_edit_profileまたはcan_modify_registryプロパティがあります。

ユーザーが特定の権利を必要とするアクションを実行しようとするたびに、ユーザーが実行されている役割に対して設定されている対応する権限を参照して、ユーザーが進行できるかどうかを確認するだけです。

あなたのアプリケーションには、ユーザーオブジェクトに「can_change_registry」プロパティを追加し、サイトのその部分にアクセスするすべてのコードに対してそのプロパティがTrueであるかどうかを確認する必要があります。