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
相关产品推荐
相关产品推荐

