Witam.
Mamy listę zadań ogólnie dostępną dla każdego użytkownika.
Jest możliwość edycji zadania przez autora.
@GetMapping("/edytuj/{id}")
public String editTask(@PathVariable long id, Model model) {
Task task = taskService.findById(id);
model.addAttribute("taskForm", task);
return "editTask";
}
@PostMapping(value = "/edytuj")
public String editTask(@ModelAttribute("taskForm") Task task, BindingResult bindingResult, Model model, HttpServletRequest request) {
taskService.create(task);
}
<form:form class="form" method="POST" action="${contextPath}/zadania/edytuj" modelAttribute="taskForm" style="padding-top:5px;">
<div class="card">
<div class="card-block">
<form:hidden path="id"/>
<div class="form-group row required">
<label class="col-form-label col-sm-1 card-label" for="topic" >Temat</label>
<div class="col-sm-11">
<form:input path="topic" class="form-control" type="text" id="topic" placeholder="Podaj temat" required="required" autofocus="true"/>
</div>
</div>
<div class="form-group row ">
<label class="col-form-label col-sm-1 card-label" for="topic" >Treść</label>
<div class="col-sm-11">
<form:input path="content" class="form-control" type="text" id="content" placeholder="Podaj Treś" required="required"/>
</div>
</div>
<div class="form-group row">
<div class="col-sm-offset-1 col-sm-10">
<sec:authorize access="isAuthenticated()">
<sec:authentication property="principal.username" var="logUsername" />
<c:if test="${taskForm.user_username == logUsername}">
<button type="submit" class="btn btn-lg btn-primary btn-block " >Zapisz</button>
</c:if>
</sec:authorize>
</div>
</div>
</div>
</div>
</form:form>
I teraz moje pytanie. Każdy może sobie wziąć np PostMana i wysłać posta z danymi:
id:3
topic:Test
content:Test
gdzie zadanie o id = 3 nie należy do niego więc zmieni się treść zadania innego użytkownika (właściciela zadania id = 3)
Jak się zabezpieczyć przed tym?
Zrobiłem tak, że sprawdzam czy istnieje zadanie o takim id a następnie czy należy do osoby zalogowanej, ale czy jest lepszy/poprawniejszy sposób?
@PostMapping(value = "/edytuj")
public String editTask(@ModelAttribute("taskForm") Task task, BindingResult bindingResult, Model model,
HttpServletRequest request) {
Task taskBase = taskService.findById(task.getId());
if (taskBase != null) {
if (taskBase.getUser_id().longValue() == securityService.getLoggedUser().getId().longValue()) {
taskService.create(task);
}
}
}