设置自定义用户查询Service

This commit is contained in:
Bunny 2025-07-11 15:32:11 +08:00
parent 219412c68c
commit 8b6dba3749
11 changed files with 202 additions and 60 deletions

View File

@ -0,0 +1,44 @@
package com.spring.step2.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.spring.step2.context.BaseContext;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* 配置MP在修改和新增时的操作
*/
@Component
public class MyBatisPlusFieldConfig implements MetaObjectHandler {
/**
* 使用mp做添加操作时候这个方法执行
*/
@Override
public void insertFill(MetaObject metaObject) {
// 设置属性值
this.strictInsertFill(metaObject, "isDeleted", Integer.class, 0);
this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
if (BaseContext.getUsername() != null) {
this.setFieldValByName("createUser", BaseContext.getUserId(), metaObject);
this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
} else {
this.setFieldValByName("createUser", 0L, metaObject);
this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
}
}
/**
* 使用mp做修改操作时候这个方法执行
*/
@Override
public void updateFill(MetaObject metaObject) {
if (BaseContext.getUserId() != null) {
this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
this.setFieldValByName("updateUser", BaseContext.getUserId(), metaObject);
}
}
}

View File

@ -1,4 +1,4 @@
package com.spring.step2.config;
package com.spring.step2.config.web;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;

View File

@ -0,0 +1,21 @@
package com.spring.step2.config.web;
import com.spring.step2.context.BaseContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
@Configuration
public class ThreadLocalCleanupInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
BaseContext.removeUser();
}
}

View File

@ -0,0 +1,26 @@
package com.spring.step2.config.web;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final ThreadLocalCleanupInterceptor threadLocalCleanupInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(threadLocalCleanupInterceptor);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}

View File

@ -0,0 +1,29 @@
package com.spring.step2.context;
public class BaseContext {
private static final ThreadLocal<Long> userId = new ThreadLocal<>();
private static final ThreadLocal<String> username = new ThreadLocal<>();
// 用户id相关
public static Long getUserId() {
return userId.get();
}
public static void setUserId(Long _userId) {
userId.set(_userId);
}
public static String getUsername() {
return username.get();
}
public static void setUsername(String _username) {
username.set(_username);
}
public static void removeUser() {
username.remove();
userId.remove();
}
}

View File

@ -6,8 +6,6 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ -15,9 +13,6 @@ import java.time.LocalDateTime;
@Schema(name = "UserDTO对象", title = "用户", description = "用户的DTO对象")
public class UserDto {
@Schema(name = "id", title = "主键")
private String id;
@Schema(name = "username", title = "用户名")
private String username;
@ -27,19 +22,4 @@ public class UserDto {
@Schema(name = "email", title = "邮箱")
private String email;
@Schema(name = "createTime", title = "创建时间")
private LocalDateTime createTime;
@Schema(name = "updateTime", title = "更新时间")
private LocalDateTime updateTime;
@Schema(name = "createUser", title = "创建用户")
private Long createUser;
@Schema(name = "updateUser", title = "更新用户")
private Long updateUser;
@Schema(name = "isDeleted", title = "是否被删除")
private Boolean isDeleted;
}

View File

@ -0,0 +1,35 @@
package com.spring.step2.security.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.spring.step2.domain.entity.UserEntity;
import com.spring.step2.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class DbUserDetailService implements UserDetailsService {
private final UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 查询当前用户
QueryWrapper<UserEntity> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(UserEntity::getUsername, username);
UserEntity userEntity = userMapper.selectOne(wrapper);
// 判断当前用户是否存在
if (userEntity == null) {
throw new UsernameNotFoundException("用户不存在");
}
return User.builder().username(userEntity.getUsername())
.password(userEntity.getPassword())
.build();
}
}

View File

@ -1,35 +1,27 @@
package com.spring.step2.security.service;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class InMemoryUserDetailsService implements UserDetailsService {
private final PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 1. 这里应该根据username从数据库或其他存储中查询用户信息
// 以下是模拟数据实际应用中应从数据库查询
// 2. 如果用户不存在抛出UsernameNotFoundException
if (!"bunny".equalsIgnoreCase(username)) {
throw new UsernameNotFoundException("User not found: " + username);
}
// 3. 构建UserDetails对象返回
return User.builder()
.username(username) // 使用传入的用户名
.password(passwordEncoder.encode("123456")) // 密码应该已经加密存储这里仅为示例
.roles("USER") // 角色会自动添加ROLE_前缀
.authorities("read", "write") // 添加具体权限
.build();
}
}
// @Service
// @RequiredArgsConstructor
// public class InMemoryUserDetailsService implements UserDetailsService {
//
// private final PasswordEncoder passwordEncoder;
//
// @Override
// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// // 1. 这里应该根据username从数据库或其他存储中查询用户信息
// // 以下是模拟数据实际应用中应从数据库查询
//
// // 2. 如果用户不存在抛出UsernameNotFoundException
// if (!"bunny".equalsIgnoreCase(username)) {
// throw new UsernameNotFoundException("User not found: " + username);
// }
//
// // 3. 构建UserDetails对象返回
// return User.builder()
// .username(username) // 使用传入的用户名
// .password(passwordEncoder.encode("123456")) // 密码应该已经加密存储这里仅为示例
// .roles("USER") // 角色会自动添加ROLE_前缀
// .authorities("read", "write") // 添加具体权限
// .build();
// }
// }

View File

@ -12,6 +12,7 @@ import com.spring.step2.mapper.UserMapper;
import com.spring.step2.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -31,6 +32,8 @@ import java.util.List;
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {
private final PasswordEncoder passwordEncoder;
/**
* * 用户 服务实现类
*
@ -59,6 +62,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
public void addUser(UserDto dto) {
UserEntity user = new UserEntity();
BeanUtils.copyProperties(dto, user);
// 设置用户密码
String password = user.getPassword();
String encodePassword = passwordEncoder.encode(password);
user.setPassword(encodePassword);
save(user);
}

View File

@ -12,6 +12,7 @@ import com.spring.step2.mapper.UsersMapper;
import com.spring.step2.service.UsersService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -31,6 +32,8 @@ import java.util.List;
@RequiredArgsConstructor
public class UsersServiceImpl extends ServiceImpl<UsersMapper, UsersEntity> implements UsersService {
private final PasswordEncoder passwordEncoder;
/**
* * 服务实现类
*
@ -57,9 +60,15 @@ public class UsersServiceImpl extends ServiceImpl<UsersMapper, UsersEntity> impl
*/
@Override
public void addUsers(UsersDto dto) {
UsersEntity users = new UsersEntity();
BeanUtils.copyProperties(dto, users);
save(users);
UsersEntity user = new UsersEntity();
BeanUtils.copyProperties(dto, user);
// 设置用户密码
String password = user.getPassword();
String encodePassword = passwordEncoder.encode(password);
user.setPassword(encodePassword);
save(user);
}
/**

View File

@ -27,9 +27,6 @@
from t_user
<where>
is_deleted = 0
<if test="dto.id != null and dto.id != ''">
and id like CONCAT('%',#{dto.id},'%')
</if>
<if test="dto.username != null and dto.username != ''">
and username like CONCAT('%',#{dto.username},'%')
</if>