You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot如何获取排除密码的全部用户信息

问题:Spring Boot接口返回用户信息时隐藏密码

我按照教程实现了基础JPA认证,想要创建/mydetails端点展示用户资料信息。尝试了如下代码:

@GetMapping("/mydetails")
public Optional<User> getUser(HttpServletRequest request) {
    Optional<User> foundUser = Optional.ofNullable(userRepo.getUserByUsername(request.getUserPrincipal().getName()));
    return foundUser;
}

返回结果包含了密码字段:

{
  "id":1,
  "username":"name.surname@companyname.com",
  "password":"$2a$10$7YzUO6scaC06LV6IgOsSXetFm4/U0WM.UZykhRfQcJBzKacyZFMK",
  "first_name":"John",
  "last_name":"Walker",
  "organization_name":"ABC",
  "role":"Admin",
  "credibility_rating":"100"
}

我希望返回除密码外的所有内容,如何阻止响应中发送密码信息?我是Spring新手,多年未使用Java,希望得到相关建议。


解决方案

方法1:给密码字段加@JsonIgnore注解

这是最简单直接的方式,在你的User实体类的password字段上添加@JsonIgnore注解,Jackson序列化时会自动跳过这个字段:

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name = "users")
public class User {
    // 其他字段定义...
    
    @JsonIgnore
    private String password;
    
    // 对应的getter、setter方法...
}

修改后,所有返回User对象的接口都会自动隐藏密码字段。

方法2:创建DTO(数据传输对象)

如果不想修改原实体类的序列化规则,可以专门创建一个用于返回前端的UserDTO类,只包含需要展示的字段:

public class UserDTO {
    private Long id;
    private String username;
    private String first_name;
    private String last_name;
    private String organization_name;
    private String role;
    private String credibility_rating;

    // 从User实体转换为DTO的构造方法
    public UserDTO(User user) {
        this.id = user.getId();
        this.username = user.getUsername();
        this.first_name = user.getFirst_name();
        this.last_name = user.getLast_name();
        this.organization_name = user.getOrganization_name();
        this.role = user.getRole();
        this.credibility_rating = user.getCredibility_rating();
    }

    // 所有字段的getter方法(不需要setter,因为是只读返回)
    public Long getId() { return id; }
    public String getUsername() { return username; }
    // 其他字段的getter...
}

然后修改接口方法,返回UserDTO对象:

@GetMapping("/mydetails")
public UserDTO getUser(HttpServletRequest request) {
    User foundUser = userRepo.getUserByUsername(request.getUserPrincipal().getName());
    return new UserDTO(foundUser);
}

这种方式的好处是解耦了数据库实体和接口返回格式,后续调整返回字段不会影响数据库操作逻辑,适合复杂场景。

方法3:使用@JsonView实现多场景字段控制(进阶)

如果需要不同接口返回不同的字段集合,可以用@JsonView。首先定义一个视图标记类:

public class Views {
    public static class Public {}
}

然后在User实体类的字段上标注对应的视图:

@Entity
@Table(name = "users")
public class User {
    @JsonView(Views.Public.class)
    private Long id;
    
    @JsonView(Views.Public.class)
    private String username;
    
    // 密码字段不添加@JsonView,默认不会被序列化返回
    private String password;
    
    @JsonView(Views.Public.class)
    private String first_name;
    
    // 其他需要返回的字段都加上@JsonView(Views.Public.class)...
    
    // getter、setter方法...
}

最后在接口方法上指定要使用的视图:

@GetMapping("/mydetails")
@JsonView(Views.Public.class)
public Optional<User> getUser(HttpServletRequest request) {
    return Optional.ofNullable(userRepo.getUserByUsername(request.getUserPrincipal().getName()));
}

这种方式适合需要灵活控制不同接口返回字段的场景。


内容的提问来源于stack exchange,提问作者Cheknov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:20:22