2014-10-13 6 views
2

저는 Play 2.3을 처음 접했고 양식과 데이터 바인딩에 많은 어려움을 겪었습니다. 다음은 두통을 불러 일으키는 시나리오입니다.Play Form은 데이터 모델에서 생략 된 필드를 전송하지 않습니다

나는 f.e.와 같은 모델을 가지고 있습니다. (주석 왼쪽으로) : 내가 좋아하는 내 컨트롤러에서이보기를 호출

@(userForm: Form[User]) 
@helper.form(action = routes.UserController.save()) { 
    @helper.inputText(userForm("name"), '_label -> "Name") 
} 

:

public class User extends Model { 
    public Integer id; 
    public String name; 
    public String anyOtherField; 
} 

지금 내가 사용자 이름을 변경할 수 있도록 원하는 scala.view에서 양식을 이 :

public static Result save() { 
    Form userForm = Form.form(User.class).bindFromRequest(); 
    User user = userForm.get() 
} 
012 : 사용자가 내가 그렇게 내 컨트롤러에 돌아 왔어요 양식을 제출

Form<User> userForm = Form.form(User.class).fill(myUser); 
return ok(views.html.usermgmt.useredit.render(userForm)); 

그러나 지금은 놀랍습니다. userForm.get()의 결과 사용자는 "이름"이외의 입력란이 없습니다. "id"없음, "anyOtherField"없음. 결과 객체가 추가 처리를 위해 전혀 쓸모가 없을 때 데이터 바인딩을 갖는 점은 무엇입니까? 내가 놓친 게 있니? 내가 뭔가를 놓치지 않는 경우

다음 내가하기 위해 상용구 코드를 많이 쓰고있는 자신을 데이터 바인딩 :

  • 중 하나를 수동으로 실제 "사용자"개체에 대한 변경 필드를 지정합니다 (이 save() 내에서 다시 가져와야 함)
  • 또는 모델의 모든 입력란에 숨김 필드를 포함하십시오. 이 경우 모델에 다른 필드를 추가하면 양식을 업데이트하는 것을 잊지 않는 것이 좋습니다.

제게 sth가 누락되었다고 알려주세요.

+0

브라우저에 데이터 (사용자 이름 만)가 전송 될 때만 폼이 이름 필드를 추가하기 때문에 Plays가 구문 분석합니다. 바인딩이라는 아이디어는 브라우저에서 가져온 데이터를 객체에 바인딩하는 것입니다. [이 답변] (http://stackoverflow.com/a/10380119/1205368) 일부 상용구를 피할 수 있습니다 – Salem

답변

0

바인딩 매개 변수는 (적어도 보안 관점에서 볼 때) 가장 좋은 방법입니다. 사용자 모델에 보안 관련 정보를 저장하는 필드가 있다고 가정 해보십시오. 예를 들어 매우 간단한 모델의 경우 isAdmin입니다. 백엔드가 데이터베이스에 정보를 저장하는 데 사용하는 User 클래스에서 양식을 바인드하는 경우 공격자는 저장 요청에 추가 매개 변수를 추가하여 쉽게 관리자가 될 수 있습니다.

바인딩 메커니즘은 백엔드 데이터 모델과 함께 사용되지 않습니다. 이것은 문서에서 명확하게 설명되지 않은 오해 인 것 같습니다. 이 보안 취약점으로 인해 버그를 한 번 제기했지만 개발자는 백엔드 모델을 사용하여 양식 데이터를 바인드하는 것이 양식 바인딩을 사용하는 방식이 아니라는 점을 분명히했습니다. 자세한 내용은이 버그 보고서를 참조하십시오. https://github.com/playframework/playframework/issues/2358