This commit is contained in:
ovo 2024-12-07 19:46:23 +08:00
parent 9f16537549
commit 11bec69f6b
5 changed files with 97 additions and 82 deletions

View File

@ -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);
}
/**

View File

@ -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);
}
}

View File

@ -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<User>()
.eq(User::getUsername, username)
);
UserDTO user = userService.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
if (user.getStatus() != 1) {
throw new UsernameNotFoundException("账号已被禁用");
}
List<SimpleGrantedAuthority> 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<SimpleGrantedAuthority> 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
);
}
}

View File

@ -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);
}

View File

@ -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<User>()
.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<User>()
.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<User>()
.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) {