Spring+React项目仅查询当前用户所属社团成员问题求助
现有代码报错原因
- Repository层方法名不匹配,Service中调用的是
findAllBySociety,但Repository实际定义的方法名为findAllUsers,方法名不一致会导致Spring初始化阶段抛出方法不存在的异常。 - JPQL语句写法错误,JPQL是面向实体对象的查询语言,不能直接使用数据库表的字段名
society_id,应该关联实体属性写为u.society.id = :id,如果要直接用数据库字段需要标注nativeQuery = true开启原生SQL查询。 - Repository方法的参数没有加
@Param绑定,Spring Data JPA无法将传入的id和查询语句中的:id做关联,会抛出参数绑定异常。
现有代码修复方案
如果要保留当前前端传society_id的逻辑,修改Repository层代码即可:
// 方法名和调用处对齐,增加@Param注解,修正JPQL写法 @Query(value = "select u from User u where u.society.id = :id") Page<User> findAllBySociety(Pageable page, @Param("id") long id);
更优实现方案(推荐)
当前实现存在越权风险:前端传入的society_id可以被用户任意篡改,普通用户可通过修改请求参数查询其他社团的用户数据。更安全的实现是直接从服务端的登录用户上下文获取所属社团ID,不需要前端传递任何社团相关参数。
具体实现步骤:
1. 调整Repository层
可以直接用Spring Data JPA的派生查询,不需要手写JPQL:
// Spring Data JPA会自动根据方法名生成查询SQL Page<User> findAllBySocietyId(Pageable pageable, Long societyId);
2. 调整Service层
从登录上下文获取当前登录用户信息,直接取其所属社团ID:
public Page<User> getUsers(Pageable pageable) { // 获取当前登录用户的用户名,以下为Spring Security的常用写法,未用Spring Security可替换为从JWT/session中取用户信息的逻辑 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); String loginUsername = auth.getName(); // 查询登录用户完整信息 User loginUser = userRepository.findByUsername(loginUsername) .orElseThrow(() -> new IllegalArgumentException("非法访问:用户未登录")); // 直接用登录用户的社团ID查询 return userRepository.findAllBySocietyId(pageable, loginUser.getSociety().getId()); }
3. 调整Controller层
不再接收ID参数:
@CrossOrigin @GetMapping("/users") Page<UserVM> getUsers(Pageable page) { return userService.getUsers(page).map(UserVM::new); }
4. 调整React端代码
请求路径不需要拼接ID:
export const listUsers = (param = { page: 0, size: 9 }) => { const path = url + `/api/1.0/users?page=${param.page || 0}&size=${param.size || 9}&sort=username,asc`; return axios.get(path); };
内容的提问来源于stack exchange,提问作者James Smith
相关产品推荐
相关产品推荐

