【问题标题】:Spring Boot and Spring Data MongoDB: hiding fields in a ResponseBodySpring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段
【发布时间】:2015-11-16 09:37:54
【问题描述】:

我将 Spring Boot 与 spring-boot-starter-data-mongodb 包一起使用。

我已经成功创建了一个方法来为我的应用返回帐户信息:

public Account queryAccountInfo(String userId) {
    Query query = new Query();
    query.addCriteria(Criteria.where("userId").is(userId));
    return mongoTemplate.findOne(query, Account.class);
}

现在,这将返回我创建的自定义类 Account 类中的所有信息:

    public class Account {

        public Account(){}


        @Id
        private String id;
        private String email;
        private String token; 
}

现在,Spring 将在 ResponseBody 对象中返回整个 Account 对象,因此它将创建一个类似于以下内容的 JSON:

{
  "id": "1234567890",
  "email": "Google@google.com",
  "token": "XXX-XXX-XXX"}

我不希望它返回“令牌”,因为这是敏感信息。如何让 Spring 不返回“令牌”字段而是返回其他所有内容?

我确定有一个 Spring 注释可以让我这样做,但我似乎找不到它:http://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/annotation/package-frame.html

【问题讨论】:

    标签: java spring mongodb spring-boot


    【解决方案1】:

    等效 Mongo 查询

    db.account.aggregate({$project:{email:1}})

    科迪戈科特林:

    package com.integracion.controller
    import com.integracion.modelo.Account
    
    import org.springframework.data.mongodb.core.*
    import org.springframework.data.mongodb.core.aggregation.Aggregation
    import org.springframework.data.mongodb.core.aggregation.ProjectionOperation
    
    import org.springframework.data.mongodb.core.query.Criteria
    import org.springframework.data.mongodb.core.query.Query
    import org.springframework.data.mongodb.core.query.Query.query
    
    @RestController
    @EnableReactiveMongoRepositories(basePackageClasses = arrayOf(AccountRepository::class))
    
    class InicioController {
        @Autowired
        private lateinit var accountRepository: AccountRepository
        @Autowired
        private lateinit var query: MongoTemplate
    
    @GetMapping("v2/filtro")
        //Query es la libreria import org.springframework.data.mongodb.core.query.Query.query
        fun filtro (q: Query): Document {
            /*
               // Equivalente en MongoDB //
                  db.account.find({},{email:1})
               //Manera simple pero devulve los excluidos con campos vacios null ""
            q.fields().include("email").exclude("token");
            var consulta : List<Account> = query.find(q,Account::class.java)*/
    
    
    // =) 
    
            /* //Equivalente en MongoDB//
            db.account.aggregate({$project:{email:1}}) */
    
    
            var p: ProjectionOperation = Aggregation.project("email")
            var a: Aggregation = Aggregation.newAggregation(p)
            var resultado: Document = query.aggregate(a,"account",Account::class.java).rawResults
    
            return resultado
        }
    }
    

    【讨论】:

      【解决方案2】:

      您的实际问题是 mongodb bean 对象和 API 中使用的对象缺乏分离。虽然这在项目的 PoC 阶段不是必需的,但当您遇到此类问题时,您应该添加第二组用于通信的 bean,并在用于 spring-data-mongo 的对象之间进行映射。

      【讨论】:

        【解决方案3】:

        方法应该是:

        query.fields().exclude("token");
        

        【讨论】:

          猜你喜欢
          • 2014-11-17
          • 2017-08-24
          • 1970-01-01
          • 1970-01-01
          • 2017-06-12
          • 2019-10-05
          • 2019-09-07
          • 2022-01-14
          • 1970-01-01
          相关资源
          最近更新 更多