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

Spring JPA添加菜品实体时自动填充当前登录用户ID作为外键的实现问题

解决方案

实现步骤

1. 新增AppUser查询接口

首先创建AppUserRepository用于查询店主信息:

public interface AppUserRepository extends JpaRepository<AppUser, Long> {
    // 根据登录邮箱查询用户,AppUser的getUsername方法返回的是邮箱
    Optional<AppUser> findByEmail(String email);
}

2. 修改DishController的保存逻辑

在保存菜品前,从Spring Security上下文中获取当前登录的店主信息,绑定到菜品实体上:

@Controller
public class DishController {
    @Autowired
    private DishService dishService;
    // 注入AppUserRepository
    @Autowired
    private AppUserRepository appUserRepository;

    // 原有其他方法保持不变

    @PostMapping("/saveDish")
    public String saveDish(@ModelAttribute("dish") Dish dish) {
        // 仅新增菜品时绑定所属店主,更新操作不覆盖原有归属
        if (dish.getDishId() == null) {
            // 获取当前登录用户的认证信息
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String loginEmail = authentication.getName();
            // 查询当前登录的店主实体
            AppUser currentOwner = appUserRepository.findByEmail(loginEmail)
                    .orElseThrow(() -> new RuntimeException("未获取到当前登录用户信息"));
            // 绑定外键关联
            dish.setApp(currentOwner);
        }
        dishService.saveDish(dish);
        return "redirect:/dish";
    }
}

注意事项

  • 你当前Dish实体中app属性的@ManyToOne注解使用了cascade = CascadeType.ALL,建议修改为@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}),避免保存菜品时意外修改店主的账号信息
  • 该实现完全在后端处理,无需修改前端Thymeleaf表单代码,也不需要在前端加隐藏字段传递用户ID,避免了参数被篡改的安全风险
  • 可额外增加权限校验逻辑:更新菜品时校验当前登录用户是否为该菜品的所属店主,防止越权操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:45:01