如何避免访问其他数据用户。 Spring 启动 + MongoDB

how avoid to access to other data users. Spring boot + MongoDB

我正在使用 Spring Boot 和 MongoDB 开发 Web 应用程序。我正在遵循 MVC 模型。

我有一个显示存储数据列表的视图,但该应用程序会忽略已登录的用户并显示每个对象。

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

在这里,第一行是另一个用户添加的,但无论如何都会显示。

我怎样才能只获得授权用户允许的对象? 我能看到的唯一方法是在每次查询后检查用户 ID,并只获取给定用户的对象。我认为应该有更好的方法来做到这一点。

代码如下:

实体

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

你的问题中有不明确的地方,但假设你有一个用户实体:

  • 您应该从 Spring 安全
  • 获取登录用户
  • 您应该包含用户实体与跟踪实体的关系(在跟踪记录中包含用户 ID 信息)
  • 然后您应该使用给定的用户 ID 查询 mongo 数据库跟踪实体。

您可以使用 Spring 存储库的字段功能进行标准查询。