Spring MVC - Edycja Obiektu

0

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);
			}
		}
	}
1

Ja to u siebie robiłem takim sposobem, że jak gdyby "doklejałem" dodatkowy filtr do zapytania na bazę (filtr że user_fk = id usera zalogowanego). Wtedy do bazy powinieneś wysłać jedno złożone zapytanie, czyli nie zwykły find ale jakiś search, namedQuery / namedNativeQuery jesli używasz Hibernate np.

1 użytkowników online, w tym zalogowanych: 0, gości: 1