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

如何配置Spring Boot+Keycloak资源服务器,仅返回当前用户对应产品?

实现Spring Boot资源服务器中用户仅能访问自身创建的产品

步骤1:从JWT Token中提取当前登录用户的userid

你的后端基于Keycloak资源服务器,Spring Security会自动解析请求头里的JWT并封装成JwtAuthenticationToken,直接从这个对象里就能拿到用户的唯一标识(对应产品表的userid):

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;

@GetMapping("/products")
public List<Product> getProducts(@AuthenticationPrincipal Jwt jwt) {
    // Keycloak默认把用户ID存在`sub` claim里,若你的userid是自定义claim,替换成对应key即可
    String currentUserId = jwt.getClaim("sub");
    return productService.getProductsByUserId(currentUserId);
}

步骤2:修改产品查询逻辑,添加用户ID过滤

在数据访问层添加按userid查询的方法,确保只返回当前用户的产品:

Repository层示例(Spring Data JPA):

public interface ProductRepository extends JpaRepository<Product, String> {
    List<Product> findByUserid(String userid);
}

Service层示例:

@Service
public class ProductService {
    @Autowired
    private ProductRepository productRepository;

    public List<Product> getProductsByUserId(String userId) {
        return productRepository.findByUserid(userId);
    }
}

步骤3:加固产品创建时的userid注入逻辑

创建产品时,强制从JWT提取userid设置到实体,忽略前端传入的值,防止恶意篡改:

@PostMapping("/products")
public Product createProduct(@RequestBody Product product, @AuthenticationPrincipal Jwt jwt) {
    String currentUserId = jwt.getClaim("sub");
    product.setUserid(currentUserId);
    return productRepository.save(product);
}

完成以上配置后,每个用户访问GET /products时,后端只会返回userid与当前登录用户ID匹配的产品,实现完全的数据隔离。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:35:20