Security
PasswordConfig 加密
package org.example.car.rental.security;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.DelegatingPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.Pbkdf2PasswordEncoder;
import org.springframework.security.crypto.scrypt.SCryptPasswordEncoder;
import java.security.SecureRandom;
import java.util.HashMap;
import java.util.Map;
@Configuration // 表示这是一个配置类,通常用于Spring框架中配置Bean等。
@Data // Lombok提供的注解,用于自动生成getter、setter、toString等方法。
public class PasswordConfig {
// 通过@Value注解从应用的配置文件中动态注入加密强度值。
@Value("${encoder.ctype.strength}")
private int strength;
// 通过@Value注解从应用的配置文件中动态注入加密使用的密钥。
@Value("${encoder.ctype.secret}")
private String secret;
/**
* 创建并返回一个BCryptPasswordEncoder实例。
* 此密码编码器使用指定的加密强度和基于secret参数生成的SecureRandom实例。
*
* @return BCryptPasswordEncoder 返回一个配置好的BCryptPasswordEncoder实例。
*/
// @Bean
// public BCryptPasswordEncoder passwordEncoder() {
// // 使用secret生成一个SecureRandom实例,以增加加密过程的随机性。
// SecureRandom secureRandom = new SecureRandom(secret.getBytes());
// return new BCryptPasswordEncoder(strength, secureRandom);
// }
@Bean
public PasswordEncoder passwordEncoder() {
Map<String, PasswordEncoder> encoders = new HashMap<>();
encoders.put("bcrypt", new BCryptPasswordEncoder(strength));
return new DelegatingPasswordEncoder("bcrypt", encoders);
}
}
// 调用方式
package org.example.car;
import org.example.car.rental.security.PasswordConfig;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.security.crypto.password.PasswordEncoder;
@SpringBootTest(classes = PasswordConfig.class)
public class PasswordConfigTest {
@Autowired
private ApplicationContext context;
@Test
public void testPasswordEncoder() {
// 从Spring上下文中获取PasswordEncoder Bean
PasswordEncoder passwordEncoder = context.getBean(PasswordEncoder.class);
// 假设你的PasswordConfig类中有一个int类型的成员变量strength,并且已经赋值
// 这里直接使用passwordEncoder来编码一个示例密码"123456"
String rawPassword = "123456";
String encodedPassword = passwordEncoder.encode(rawPassword);
System.out.println("Encoded Password: " + encodedPassword);
// 可选:验证编码后的密码是否能正确匹配原始密码
boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);
assert matches : "Encoded password does not match the raw password";
}
}