Spring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段

Posted

技术标签:

【中文标题】Spring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段【英文标题】:Spring Boot and Spring Data MongoDB: hiding fields in a 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

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于Spring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段的主要内容,如果未能解决你的问题,请参考以下文章

spring boot整合spring Data JPA和freemarker

使用 spring-boot 和 spring-data 全局启用休眠过滤器

Spring Boot 和 Spring Data MongoDB:在 ResponseBody 中隐藏字段

spring boot系列spring boot 配置spring data jpa (查询方法)

无法将 Spring Data MongoDB + Spring Data JPA 与 Spring Boot 一起使用

使用 spring-data-jpa 和 MockMvc 进行 spring boot junit 测试