refactor: 修改加密方式

This commit is contained in:
Bunny 2025-02-18 17:42:16 +08:00
parent 95593f6a5c
commit b7ba8d5af4
5 changed files with 38 additions and 54 deletions

View File

@ -4,8 +4,11 @@ import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("cn.bunny.services.mapper") @MapperScan("cn.bunny.services.mapper")
@ -18,4 +21,9 @@ public class ServiceApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(ServiceApplication.class, args); SpringApplication.run(ServiceApplication.class, args);
} }
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
} }

View File

@ -4,7 +4,6 @@ import cn.bunny.dao.entity.system.AdminUser;
import cn.bunny.dao.vo.result.ResultCodeEnum; import cn.bunny.dao.vo.result.ResultCodeEnum;
import cn.bunny.services.mapper.UserMapper; import cn.bunny.services.mapper.UserMapper;
import cn.bunny.services.security.custom.CustomAuthorizationManagerServiceImpl; import cn.bunny.services.security.custom.CustomAuthorizationManagerServiceImpl;
import cn.bunny.services.security.custom.CustomPasswordEncoder;
import cn.bunny.services.security.filter.TokenLoginFilterService; import cn.bunny.services.security.filter.TokenLoginFilterService;
import cn.bunny.services.security.handelr.SecurityAccessDeniedHandler; import cn.bunny.services.security.handelr.SecurityAccessDeniedHandler;
import cn.bunny.services.security.handelr.SecurityAuthenticationEntryPoint; import cn.bunny.services.security.handelr.SecurityAuthenticationEntryPoint;
@ -40,9 +39,6 @@ public class WebSecurityConfig {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired
private CustomPasswordEncoder customPasswordEncoder;
@Autowired @Autowired
private CustomAuthorizationManagerServiceImpl customAuthorizationManagerService; private CustomAuthorizationManagerServiceImpl customAuthorizationManagerService;
@ -50,7 +46,7 @@ public class WebSecurityConfig {
private AuthenticationConfiguration authenticationConfiguration; private AuthenticationConfiguration authenticationConfiguration;
@Bean @Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity, UserMapper userMapper) throws Exception { public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity httpSecurity
// 前端段分离不需要---禁用明文验证 // 前端段分离不需要---禁用明文验证
.httpBasic(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable)
@ -76,14 +72,10 @@ public class WebSecurityConfig {
exception.accessDeniedHandler(new SecurityAccessDeniedHandler()); exception.accessDeniedHandler(new SecurityAccessDeniedHandler());
}) })
// 登录验证过滤器 // 登录验证过滤器
.addFilterBefore(new TokenLoginFilterService(authenticationConfiguration, userService), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new TokenLoginFilterService(authenticationConfiguration, userService), UsernamePasswordAuthenticationFilter.class);
// 自定义密码加密器和用户登录
.passwordManagement(customPasswordEncoder);
return httpSecurity.build(); return httpSecurity.build();
} }
/** /**
* 使用数据库方式 * 使用数据库方式
* 登录方式邮箱+用户名 * 登录方式邮箱+用户名

View File

@ -1,28 +0,0 @@
package cn.bunny.services.security.custom;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.PasswordManagementConfigurer;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.util.DigestUtils;
/**
* 自定义密码加密比对
*/
@Configuration
public class CustomPasswordEncoder implements PasswordEncoder, Customizer<PasswordManagementConfigurer<HttpSecurity>> {
@Override
public String encode(CharSequence rawPassword) {
return DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes());
}
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
return encodedPassword.matches(DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes()));
}
@Override
public void customize(PasswordManagementConfigurer<HttpSecurity> httpSecurityPasswordManagementConfigurer) {
}
}

View File

@ -43,9 +43,9 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -66,33 +66,26 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
@Autowired @Autowired
private UserUtil userUtil; private UserUtil userUtil;
@Autowired @Autowired
private ConcreteSenderEmailTemplate concreteSenderEmailTemplate; private ConcreteSenderEmailTemplate concreteSenderEmailTemplate;
@Autowired @Autowired
private RedisTemplate<String, Object> redisTemplate; private RedisTemplate<String, Object> redisTemplate;
@Autowired @Autowired
private FilesService filesService; private FilesService filesService;
@Autowired @Autowired
private UserDeptMapper userDeptMapper; private UserDeptMapper userDeptMapper;
@Autowired @Autowired
private UserRoleMapper userRoleMapper; private UserRoleMapper userRoleMapper;
@Autowired @Autowired
private UserLoginLogMapper userLoginLogMapper; private UserLoginLogMapper userLoginLogMapper;
@Autowired @Autowired
private EmailTemplateMapper emailTemplateMapper; private EmailTemplateMapper emailTemplateMapper;
@Autowired @Autowired
private RoleMapper roleMapper; private RoleMapper roleMapper;
@Autowired @Autowired
private UserMapper userMapper; private UserMapper userMapper;
@Autowired
private PasswordEncoder passwordEncoder;
/** /**
* 前台用户登录接口 * 前台用户登录接口
@ -237,19 +230,19 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
String password = dto.getPassword(); String password = dto.getPassword();
// 对密码加密 // 对密码加密
String md5Password = DigestUtils.md5DigestAsHex(password.getBytes()); String encode = passwordEncoder.encode(password);
AdminUser adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId)); AdminUser adminUser = getOne(Wrappers.<AdminUser>lambdaQuery().eq(AdminUser::getId, userId));
// 判断是否存在这个用户 // 判断是否存在这个用户
if (adminUser == null) throw new AuthCustomerException(ResultCodeEnum.USER_IS_EMPTY); if (adminUser == null) throw new AuthCustomerException(ResultCodeEnum.USER_IS_EMPTY);
// 判断新密码是否与旧密码相同 // 判断新密码是否与旧密码相同
if (adminUser.getPassword().equals(md5Password)) if (adminUser.getPassword().equals(encode))
throw new AuthCustomerException(ResultCodeEnum.UPDATE_NEW_PASSWORD_SAME_AS_OLD_PASSWORD); throw new AuthCustomerException(ResultCodeEnum.UPDATE_NEW_PASSWORD_SAME_AS_OLD_PASSWORD);
// 更新用户密码 // 更新用户密码
adminUser = new AdminUser(); adminUser = new AdminUser();
adminUser.setPassword(md5Password); adminUser.setPassword(encode);
adminUser.setId(userId); adminUser.setId(userId);
updateById(adminUser); updateById(adminUser);
@ -412,7 +405,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
// 数据库中的密码 // 数据库中的密码
String dbPassword = adminUser.getPassword(); String dbPassword = adminUser.getPassword();
password = DigestUtils.md5DigestAsHex(password.getBytes()); password = passwordEncoder.encode(password);
// 判断数据库中密码是否和更新用户密码相同 // 判断数据库中密码是否和更新用户密码相同
if (dbPassword.equals(password)) throw new AuthCustomerException(ResultCodeEnum.NEW_PASSWORD_SAME_OLD_PASSWORD); if (dbPassword.equals(password)) throw new AuthCustomerException(ResultCodeEnum.NEW_PASSWORD_SAME_OLD_PASSWORD);
@ -469,12 +462,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
@Override @Override
public void addAdminUser(@Valid AdminUserAddDto dto) { public void addAdminUser(@Valid AdminUserAddDto dto) {
// 对密码加密 // 对密码加密
String md5Password = DigestUtils.md5DigestAsHex(dto.getPassword().getBytes()); String encode = passwordEncoder.encode(dto.getPassword());
// 保存数据 // 保存数据
AdminUser adminUser = new AdminUser(); AdminUser adminUser = new AdminUser();
BeanUtils.copyProperties(dto, adminUser); BeanUtils.copyProperties(dto, adminUser);
adminUser.setPassword(md5Password); adminUser.setPassword(encode);
save(adminUser); save(adminUser);
// 插入用户部门关系表 // 插入用户部门关系表

View File

@ -0,0 +1,19 @@
package cn.bunny.services.service.impl;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootTest
class UserServiceImplTest {
@Autowired
private PasswordEncoder passwordEncoder;
@Test
void updateUserPasswordByAdmin() {
String encode = passwordEncoder.encode("123456");
System.out.println(encode);
}
}