1

最初のGrailsアプリケーションを作成しようとしていますが、ドメインモデルの多くを現在のユーザーに関連付ける必要があることがわかりました。たとえば、作成されたコメントは現在のユーザーが所有している必要があり、保存および編集されたプロファイルは現在のユーザーのものである必要があります。

generate controller毎回必要なコードを使い始めました。ただし、多くの場合、これは私が現在これらのコントローラーに加えている唯一の変更であり、毎回同じものです。より「優雅」に感じるよりエレガントな方法がなければなりません。

私がこれまでに思いついた最良のアイデアは、現在のユーザーに関連付ける必要のあるフィールドに、すべてのモデルでまったく同じものに名前を付けてから(たとえば) 、現在保存されているものに関して現在設定されているものをオーバーライドoriginatingUserするためにフィルターを使用することです。で。beforeoriginatingUserUsersession

このアプローチに欠陥はありますか?もっと良いものはありますか?

4

4 に答える 4

1

generate controller毎回必要なコードを使い始めました。ただし、多くの場合、これは私が現在これらのコントローラーに加えている唯一の変更であり、毎回同じものです。より「優雅」に感じるよりエレガントな方法がなければなりません。

何をするにしても、どこにでもコードをコピーして貼り付けないでください。それはGrailsとは何の関係もありません。ただそれをしないでください。あなたがそれをするたびに、神は子猫を殺します。

あなたがしていることについての詳細を知らずに言うのは難しいですが、私はいくつかのオプションを見ることができます

1)エンティティをデータベースから除外する必要がある場合は、エンティティをロードすると、ユーザーと一緒にセッションに入れることができます。基本コントローラークラスにコードを記述してセッションにアクセスし、「現在の」モデルインスタンスを取得してから、すべてのコントローラーにそのコントローラーを拡張させることができます。または、オプションで、セッションアクセスコードをある種のヘルパーに配置することもできます。

2)1の問題は、スケーリングがうまくいかないことです。保持する必要のあるオブジェクトがたくさんある場合は、それらをセッションに入れません。この場合、あなたはあなたのデザインを見る必要があります。本当にインスタンスをセッションに保持する必要がありますか?ユーザーが変更中のオブジェクトを所有しているかどうかを確認する場合は、その確認をサービスメソッドに入れることができます。したがって、編集をチェックする場合、サービスが最初に行う必要があるのは、ユーザーがa)インスタンスを変更するために必要な役割を持っているかどうか(セキュリティを使用している場合)、およびb)ユーザーがインスタンスを所有しているかどうかをチェックすることです(またはそれ以外の場合)変更できます)。

コメントに基づいて編集

まず、Spring Securityプラグインを使用している場合は、現在のユーザーを簡単に取得できます。
このルートを使用する場合は、ユーザーを取得するすべてのコントローラー/サービスにセキュリティサービスを注入する必要があります。

次に、そうでない場合は、SessionHelper静的メソッドを含むクラスを作成して、すべてのセッション操作コードを1か所にまとめる必要があります(Spring Securityにもこのようなヘルパーがあります)。これを行うと、いつでも現在のユーザーを取得できるワンライナーになります。

最後に、サービスレイヤーにユーザーを配置する必要があります。サービスは、永続インスタンスのすべての操作を実行する必要があります。ユーザーが自分のアイテムにしかアタッチできない場合、これは、特定のことに対して間違ったユーザーを取得することによって発生する可能性のあるエラーにも役立ちます。

于 2012-08-20T20:05:48.450 に答える
0

文字通り、すべてのオブジェクトをユーザーに関連付ける必要がある場合は、必要なコードを含めるようにコントローラーテンプレートを変更できます。

于 2012-08-20T19:08:04.887 に答える
0

独自のセキュリティメカニズムを導入する予定はありますか?Spring Securityプラグイン(またはそのようなもの)を調べる方が便利な場合があります。コントローラーテンプレートを変更して、プロセスを迅速化できるかどうかを確認してください。これらの最初の反復の後、あなたは本当にいくつかの子猫を救おうとするべきです。

于 2012-08-20T20:12:40.700 に答える
0

私がこれまでに思いついた最良のアイデアは、現在のユーザーに関連付ける必要のあるフィールドに、すべてのモデルでまったく同じものに名前を付けてから(たとえば、originingUser)、現在originingUserとして設定されているものをオーバーライドする前にフィルターを使用することです。セッションに保存されている現在のユーザー。

このアプローチに欠陥はありますか?もっと良いものはありますか?

別のより複雑なアプローチを使用できます。AST変換、注釈などですが、これは単純で効果的なアプローチです。

ちなみに、Spring Core Securityプラグインを使用していますか?

于 2012-08-22T12:26:03.147 に答える