diff --git a/src/main/java/com/guwan/backend/aspect/OperationLogAspect.java b/src/main/java/com/guwan/backend/aspect/OperationLogAspect.java index 2789d87..8fb43b7 100644 --- a/src/main/java/com/guwan/backend/aspect/OperationLogAspect.java +++ b/src/main/java/com/guwan/backend/aspect/OperationLogAspect.java @@ -73,44 +73,48 @@ public class OperationLogAspect { * 保存日志 */ private void saveLog(ProceedingJoinPoint joinPoint, OperationLog operationLog, long beginTime, SysLog sysLog) { - // 获取当前请求 - ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attributes != null) { - HttpServletRequest request = attributes.getRequest(); - sysLog.setIp(getIpAddress(request)); - sysLog.setUserAgent(request.getHeader("User-Agent")); - } - - // 获取当前用户信息 - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetails userDetails) { - sysLog.setUserId(userDetails.getUserId()); - sysLog.setUsername(userDetails.getUsername()); - } - - // 获取方法信息 - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - Method method = signature.getMethod(); - String className = method.getDeclaringClass().getName(); - String methodName = method.getName(); - sysLog.setMethod(className + "." + methodName); - - // 获取请求参数 try { - String params = objectMapper.writeValueAsString(joinPoint.getArgs()); - sysLog.setParams(params.length() > 2000 ? params.substring(0, 2000) : params); + // 获取当前请求 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes != null) { + HttpServletRequest request = attributes.getRequest(); + sysLog.setIp(getIpAddress(request)); + sysLog.setUserAgent(request.getHeader("User-Agent")); + } + + // 获取当前用户信息 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetails userDetails) { + sysLog.setUserId(userDetails.getUserId()); + sysLog.setUsername(userDetails.getUsername()); + } + + // 获取方法信息 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + Method method = signature.getMethod(); + String className = method.getDeclaringClass().getName(); + String methodName = method.getName(); + sysLog.setMethod(className + "." + methodName); + + // 获取请求参数 + try { + String params = objectMapper.writeValueAsString(joinPoint.getArgs()); + sysLog.setParams(params.length() > 2000 ? params.substring(0, 2000) : params); + } catch (Exception e) { + log.error("序列化请求参数失败", e); + sysLog.setParams(Arrays.toString(joinPoint.getArgs())); + } + + // 设置操作信息 + sysLog.setOperation(operationLog.description()); + sysLog.setCreateTime(LocalDateTime.now()); + sysLog.setTimeConsuming(System.currentTimeMillis() - beginTime); + + // 保存日志 + sysLogMapper.insert(sysLog); } catch (Exception e) { - log.error("序列化请求参数失败", e); - sysLog.setParams(Arrays.toString(joinPoint.getArgs())); + log.error("记录操作日志失败", e); } - - // 设置操作信息 - sysLog.setOperation(operationLog.description()); - sysLog.setCreateTime(LocalDateTime.now()); - sysLog.setTimeConsuming(System.currentTimeMillis() - beginTime); - - // 保存日志 - sysLogMapper.insert(sysLog); } /** diff --git a/src/main/java/com/guwan/backend/security/JwtAuthenticationFilter.java b/src/main/java/com/guwan/backend/security/JwtAuthenticationFilter.java index 47471ee..4e702d1 100644 --- a/src/main/java/com/guwan/backend/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/guwan/backend/security/JwtAuthenticationFilter.java @@ -107,17 +107,21 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { * 设置认证信息到 SecurityContext */ private void setAuthentication(HttpServletRequest request, String jwt) { - Long userId = jwtUtil.getUserIdFromToken(jwt); - if (SecurityContextHolder.getContext().getAuthentication() == null) { - UserDetails userDetails = userDetailsService.loadUserById(userId); - - UsernamePasswordAuthenticationToken authentication = - new UsernamePasswordAuthenticationToken( - userDetails, null, userDetails.getAuthorities()); - authentication.setDetails( - new WebAuthenticationDetailsSource().buildDetails(request)); + try { + Long userId = jwtUtil.getUserIdFromToken(jwt); + if (SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = userDetailsService.loadUserById(userId); + + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + authentication.setDetails( + new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authentication); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } catch (Exception e) { + log.error("设置用户认证信息失败", e); } } diff --git a/src/main/java/com/guwan/backend/security/UserDetailsServiceImpl.java b/src/main/java/com/guwan/backend/security/UserDetailsServiceImpl.java index f28d50f..41732f3 100644 --- a/src/main/java/com/guwan/backend/security/UserDetailsServiceImpl.java +++ b/src/main/java/com/guwan/backend/security/UserDetailsServiceImpl.java @@ -1,8 +1,7 @@ package com.guwan.backend.security; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.guwan.backend.entity.User; -import com.guwan.backend.mapper.UserMapper; +import com.guwan.backend.dto.user.UserDTO; +import com.guwan.backend.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -17,50 +16,35 @@ import java.util.List; @RequiredArgsConstructor public class UserDetailsServiceImpl implements UserDetailsService { - private final UserMapper userMapper; + private final UserService userService; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userMapper.selectOne( - new LambdaQueryWrapper() - .eq(User::getUsername, username) - ); - + UserDTO user = userService.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("用户不存在"); } - - if (user.getStatus() != 1) { - throw new UsernameNotFoundException("账号已被禁用"); - } - - List authorities = new ArrayList<>(); - authorities.add(new SimpleGrantedAuthority("ROLE_USER")); - - return new CustomUserDetails( - user.getId(), - user.getUsername(), - user.getPassword(), - authorities, - user.getStatus() == 1 - ); + return convertToUserDetails(user); } public UserDetails loadUserById(Long userId) throws UsernameNotFoundException { - User user = userMapper.selectById(userId); + UserDTO user = userService.getUserById(userId); if (user == null) { throw new UsernameNotFoundException("用户不存在"); } + return convertToUserDetails(user); + } + private UserDetails convertToUserDetails(UserDTO user) { List authorities = new ArrayList<>(); authorities.add(new SimpleGrantedAuthority("ROLE_USER")); - + return new CustomUserDetails( - user.getId(), - user.getUsername(), - user.getPassword(), - authorities, - user.getStatus() == 1 + user.getId(), + user.getUsername(), + user.getPassword(), + authorities, + user.getStatus() == 1 ); } } \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/service/UserService.java b/src/main/java/com/guwan/backend/service/UserService.java index a350b0a..1edf774 100644 --- a/src/main/java/com/guwan/backend/service/UserService.java +++ b/src/main/java/com/guwan/backend/service/UserService.java @@ -26,4 +26,7 @@ public interface UserService { void resetPassword(String email); public String refreshToken(String token); + UserDTO findByUsername(String username); + UserDTO findByEmail(String email); + UserDTO findByPhone(String phone); } \ No newline at end of file diff --git a/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java b/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java index 9e13286..c288d0f 100644 --- a/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java +++ b/src/main/java/com/guwan/backend/service/impl/UserServiceImpl.java @@ -219,25 +219,45 @@ public class UserServiceImpl implements UserService { return null; } - private User findByUsername(String username) { - return userMapper.selectOne( + @Override + public UserDTO findByUsername(String username) { + User user = userMapper.selectOne( new LambdaQueryWrapper() .eq(User::getUsername, username) ); + return convertToDTO(user); } - private User findByEmail(String email) { - return userMapper.selectOne( + @Override + public UserDTO findByEmail(String email) { + User user = userMapper.selectOne( new LambdaQueryWrapper() .eq(User::getEmail, email) ); + return convertToDTO(user); } - private User findByPhone(String phone) { - return userMapper.selectOne( + @Override + public UserDTO findByPhone(String phone) { + User user = userMapper.selectOne( new LambdaQueryWrapper() .eq(User::getPhone, phone) ); + return convertToDTO(user); + } + + private User findUserByUsername(String username) { + UserDTO userDTO = findByUsername(username); + return userDTO != null ? convertToEntity(userDTO) : null; + } + + private User convertToEntity(UserDTO dto) { + if (dto == null) { + return null; + } + User user = new User(); + BeanUtils.copyProperties(dto, user); + return user; } private UserDTO convertToDTO(User user) {