SetDisallowedFields를 사용할 때 "ADD"및 "업데이트"의 하나의 컨트롤러 인 Spring MVC?
-
05-07-2019 - |
문제
그래서 나는 새로운 것을 "추가"하거나 기존의 것을 "업데이트"할 수있는 간단한 형식을 가지고 있습니다.
내가 원하는 것은 추가 및 업데이트를 처리 할 수있는 하나의 컨트롤러를 갖는 것입니다. 처음에 이것은 새로운 것을 추가 할 때 "ID"필드가 허용되지 않도록 Initbinder에서 setDisallowedFields를 사용하는 문제를 고려할 때까지 이것은 단순 해 보입니다.
현재 Initbinder 메소드를 제외하고 동일한 코드가있는 두 개의 컨트롤러가 있습니다.
제안이나 조언이 있습니까? (나는 당신이 나에게 좋은 이유를 줄 수 있다면 두 개의 컨트롤러를 유지하고 싶다는 주장에 열려 있습니다)
해결책
실제로 추가 및 업데이트시 "ID"필드를 허용하지 않아야합니다. 그렇지 않으면 악성 사용자는 업데이트 요청의 "ID"요청 매개 변수의 값을 조작하고 양식으로 표시된 것과 다른 레코드를 업데이트 할 수 있습니다 (ACL 또는 기타 도메인 수준 보안이 없다고 가정 함).
그러나 단순히 "ID"필드를 허용하지 않으면 컨트롤러는 ID를 NULL로 취급합니다. 이는 삽입 할 때 작동하지만 업데이트 할 때는 작동하지 않습니다 (예 : 지속 메커니즘에 따라 업데이트 대신 새 레코드를 삽입하려고 시도 할 수 있습니다. '다시 사용). 따라서 컨트롤러가 요청 사이에 도메인 오브젝트 (ID뿐만 아니라 모든 허용되지 않은 필드)의 부탁 할 수없는 값을 기억하여 모든 올바른 값을 서비스 계층 또는 기타 비즈니스 로직으로 보낼 수 있습니다. 이것은 다음과 같이 유형 수준 @sessionattributes 주석을 사용하여 수행됩니다 (명확성을 위해 생략 된 기타 주석).
@SessionAttributes("thing") // the name of your domain object in the model
public class ThingController {
public void setDisallowedFields(WebDataBinder binder) {
binder.setDisallowedFields("id", "someOtherUneditableField");
}
// request handling methods go here as before
}
더 나은 보안을 위해 허용 된 필드가 아닌 허용 된 필드를 설정하십시오. 어느 쪽이든, 요청에서 기존 필드 값이 무시되는 모든 것을 채우려면 @sessionattributes 주석이 필요합니다.
다른 팁
방법 서명 initBinder
가져옵니다 HttpServletRequest
:
protected void initBinder(HttpServletRequest request,
ServletRequestDataBinder binder)
아마 당신은 가질 수 있습니다 initBinder()
요청 매개 변수를 확인하여 조건부로 설정 해야하는지 확인하십시오. setDisallowedFields
?
(도움이되지 않으면 문제를 올바르게 이해하지 못할 것입니다 ...)
단일 컨트롤러 로이 작업을 수행하는 방식은 내 명령 개체에 부울이 새 개체인지 아닌지를 나타내는 것입니다. OnSubmit에서는 부울에게 추가 또는 업데이트 작업을 수행 해야하는지 확인할 수 있습니다.