如何配置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
相关产品推荐
相关产品推荐

