Как избежать доступа к другим пользователям данных.Пружинная загрузка + MongoDB - PullRequest
0 голосов
/ 06 февраля 2019

Я занимаюсь разработкой веб-приложения с использованием Spring Boot и MongoDB.Я следую модели MVC.

У меня есть представление, которое показывает список сохраненных данных, но приложение игнорирует зарегистрированного пользователя и показывает все объекты.

https://i.stack.imgur.com/zl7TC.png

Здесь первая строка была добавлена ​​другим пользователем, но она все равно показывается.

Как я могу получить только объект, разрешенный для аутентифицированного пользователя?. Единственный способ, которым я могуsee проверяет идентификатор пользователя после каждого запроса и получает только объект данного пользователя.Я думаю, что должен быть лучший способ сделать это.

Код следующий:

Сущность

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;

import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "trackings")
public class Tracking extends Entity implements Serializable {

    private static final long serialVersionUID = -1249902722123443448L;

    @Indexed(unique = true, direction = IndexDirection.DESCENDING)
    private String trackingName;

    private String SoftwareName;

    @DBRef
    private Set<Alarm> alarms;

    public String getTrackingName() {
        return trackingName;
    }

    public void setTrackingName(String trackingName) {
        this.trackingName = trackingName;
    }

    public String getSoftwareName() {
        return SoftwareName;
    }

    public void setSoftwareName(String softwareName) {
        SoftwareName = softwareName;
    }

    public Collection<Alarm> getAlarms() {
        return alarms;
    }

    public void setAlarms(Set<Alarm> alarms) {
        this.alarms = alarms;
    }

}

Репозиторий

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

import us.etsii.fvt.domains.Tracking;

@Repository
public interface TrackingRepository extends MongoRepository<Tracking, String>{

    Tracking findByTrackingName(String name);

}

Контроллер

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import us.etsii.fvt.domains.Alarm;
import us.etsii.fvt.domains.Tracking;
import us.etsii.fvt.domains.User;
import us.etsii.fvt.services.TrackingService;
import us.etsii.fvt.services.UserService;

@Controller
public class TrackingController {

    @Autowired
    private UserService userService;

    @Autowired
    private TrackingService trackingService;

    @RequestMapping(value = { "/tracking" }, method = RequestMethod.GET)
    public ModelAndView tracking() {
        ModelAndView modelAndView = new ModelAndView();

        // Añadimos el usuario al modelo
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        User user = userService.findUserByEmail(auth.getName());
        modelAndView.addObject("currentUser", user);
        modelAndView.addObject("fullName", user.getFullname());

        // Añadimos la lista de trackings al modelo
        List<Tracking> trackings = trackingService.findAll();
        modelAndView.addObject("trackings", trackings);

        // Devolvemos el modelo
        modelAndView.setViewName("tracking");
        return modelAndView;
    }

    ...
}

Сервис

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import us.etsii.fvt.domains.Tracking;
import us.etsii.fvt.repositories.TrackingRepository;

@Service
public class TrackingService {

    @Autowired
    private TrackingRepository trackingRepository;

    public Tracking findTrackingByName(String name) {
        return trackingRepository.findByTrackingName(name);
    }

    public void saveTracking(Tracking tracking) {
        trackingRepository.save(tracking);
    }

    public List<Tracking> findAll() {
        return trackingRepository.findAll();
    }

    public Tracking findById(String id) {
        Optional<Tracking> t = trackingRepository.findById(id);
        if(!t.isPresent()) {
            return null;
        }
        return t.get();
    }

    public void remove(String id) {
        trackingRepository.deleteById(id);      
    }
}

1 Ответ

0 голосов
/ 06 февраля 2019

В вашем вопросе есть неоднозначные моменты, но при условии, что у вас есть пользовательский объект:

  • Вы должны получить зарегистрированного пользователя от Spring Security
  • Youдолжно включать отношение объекта пользователя к объекту отслеживания (включая информацию об идентификаторе пользователя в записях отслеживания)
  • Затем необходимо запросить объект отслеживания mongo db с указанным идентификатором пользователя.

Вы можете использовать стандартный запрос по полю в Spring Repository.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...