2016-05-30 5 views
0

私はDemandエンティティを持っています。私は問題なくエンティティを更新することができますが、私の承認はセキュリティ上の問題があると思います。あなたSEとしてSpring MVCとThymeleafはエンティティIDリークを防ぎます

demandController

@RequestMapping(value = "/details/{id}", method = RequestMethod.POST) 
public String updateDemand(@PathVariable("id") Long id, @Valid @ModelAttribute Demand demand, BindingResult result) { 
    if (result.hasErrors()) { 
     return "demandUpdateForm"; 

    } else { 
     demand.setDemandId(id); 
     demandService.updateDemand(demand); 
     return "redirect:/demands"; 
    } 
} 

serviceImpl

@Override 
public Demand updateDemand(Demand demand) { 
    return demandRepository.save(demand); 
} 

フォーム

<form id="vendorForm" th:action="@{/demands/details/__${demand.demandId}__}" th:object="${demand}" method="post" > 

私はアクションからDemandIdを得る。たとえば、第5番目のIDのdemandを更新して、更新フォームを取得したいとします。その後、開発ツールを使用してdemandIdを変更し、[送信]をクリックします。私が2番目のidと2番目のidを変更した場合、2番目のID demandは5番目のものではありません。どうすればこのような状況を防ぐことができますか?

答えて

1

この操作のために管理されていないBeanを作成し、それをフォームバッキングBeanとして渡す方が良いと思います。

public class DemandBean { 
    private Long id; 
    private String name; 
    ... 
    // more fields 
} 

コントローラー:

@RequestMapping(value = "/details/update", method = RequestMethod.POST) 
public String updateDemand(@Valid @ModelAttribute("demandBean") DemandBean demandBean, BindingResult result) { 
    if (result.hasErrors()) { 
     return "demandUpdateForm"; 
    } else { 
     demandService.updateDemand(demandBean.getId(), demandBean.getName, ...); 
     return "redirect:/demands"; 
    } 
} 

サービス方法:

@Override 
public void updateDemand(Long id, String name, //etc) { 
    Demand d = id == null ? new Demand() : demandRepository.findOne(id); 
    d.setName(name); 
    // ... 
    // set other fields 
    return demandRepository.save(demand); 
} 

このアプローチは、あなたがidを渡すと、セキュリティの漏洩を防ぐことができます。

+0

私は15のような私の需要エンティティに多くのフィールドを持っています。フィールドに新しい値を設定する簡単な方法はありますか? – fatiherdem

+0

私の仕事はあなたを提供するために、あなたは次の作業を決める:) – sanluck

関連する問題