Cześć,
czytałem, że przechowywanie hasła w postaci Stringa
to zły pomysł. Trochę myślałem o tym, jak zaimplementować to w kodzie, napisałem taki przykład.
Request rejestracji ma normalnie pole password
jako String
.
public record RegisterRequest(String username, String email, String password) {}
W kontrolerze zamieniam hasło na tablicę char[]
i przekazuję ją dalej. Za każdym razem, gdy hasło jest używane, czyszczę tablicę, tak jak w kodzie poniżej. Czy o to właśnie chodzi?.
Kontroller:
@PostMapping("/register")
public ResponseEntity<ApiResponse> register(RegisterRequest request) {
char[] passwordChars = request.password().toCharArray();
ApiResponse registrationResponse = registration.registerUser(request.username(), request.email(), passwordChars);
Arrays.fill(passwordChars, '\0');
return new ResponseEntity<>(registrationResponse, HttpStatus.CREATED);
}
Przykłądowo klasa odpowiadająca za walidajcę:
public void validate(String username, String email, char[] password) {
String stringPassword = new String(password);
if (!stringPassword.matches("^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$")) {
Arrays.fill(password, '\0');
throw new CredentialValidationException("Invalid password format. The password must contain at least " +
"8 characters, including uppercase letters, lowercase letters, numbers, and special characters.");
}
Arrays.fill(password, '\0');
}
Jakaś klasa odpowiadająca za tworzenie usera:
public class UserCreator {
private final PasswordEncoder passwordEncoder;
private final RegistrationRoleRepository roleRepository;
public UserCreator(PasswordEncoder passwordEncoder,
RegistrationRoleRepository roleRepository) {
this.passwordEncoder = passwordEncoder;
this.roleRepository = roleRepository;
}
public User createUser(String username, String email, char[] password) {
String encodedPassword;
try {
encodedPassword = passwordEncoder.encode(new String(password));
} finally {
Arrays.fill(password, '\0');
}
return new User.Builder()
.withUsername(username)
.withEmail(email)
.withPassword(encodedPassword)
.withRole(fetchDefaultUserRole())
.build();
}