2016-05-11 12 views
0

私はウェブ上の自分のプロフィールを編集する簡単なフォームを持っています。ユーザーを表す「Person」Beanには、フォームで変更できない多くの内部フィールドが含まれています。したがって、私はフォーム上で編集可能なフィールドのサブセットを持っています。ここまでは順調ですね。一部の上級ユーザーがChromeブラウザで開発ツールを開き、フォームに他のフィールドを追加したり、既存のフィールドの名前を変更したりすると、これらのフィールドは 'Person' Beanにバインドされ、データベースに格納されます。そのような方法で、ユーザーはフォームを簡単にスプーフィングし、許可されていないフィールドの値を変更することができます。フォームの送信中にどのフィールド(Beanプロパティ)をバインドできるか(サーバー側)を定義する方法はありますか?ここでフォーム提出時にバインドされるフィールドを避けるにはどうすればよいですか?

は、コントローラのメソッドのシグネチャは、アイデアを得るためにどのように見えるかです:

@RequestMapping(path = "/profile/edit", method = RequestMethod.POST) 
public String editProfile(@ModelAttribute("profile") Person doc, BindingResult result, Model m){ 
    ... saving doc to database ... 
} 

私はThymeleafとSpringBoot 1.3.5を使用しています...

+0

'@ InitBinder'でアノテーション付けされたメソッドを作成し、[' WebDataBinder']型の引数を渡します(http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web /bind/WebDataBinder.html)、どのフィールドが許可されているか許可されていないかを設定できます。 –

答えて

0

ソリューションは非常に簡単であることが判明しました。私はコントローラに注釈付きメソッド@InitBinderを追加し、許可されたフィールドのリストを指定するためにWebDataBinderオブジェクトを使用しました。これを行うには、binder.setAllowedFields(...)メソッドを使用できます。フィールド名では、 "xxx *"、 "* xxx"、 "xxx"のパターンがサポートされているため、Bean内で適切に名前が付けられたフィールドを簡単に指定できます。ポストリクエスト変数が私のbeanにバインドされると、これらの許可フィールドは保持され、他のフィールドは拒否され、バインドされません。

コード例:

@InitBinder // or @InitBinder("profile") with ModelAttribute name information 
public void initBinder(WebDataBinder binder) { 
    binder.setAllowedFields("settings*"); 
} 

は、詳細な情報についてはDataBinder docsを参照してください。

関連する問題