Одно я подозреваю, что виноват BCrypt, поскольку из-за того, что он генерирует случайную соль при кодировании, возможно, просто возможно, зашифрованный текст заканчивается быть другим и все такое, что странно, поскольку я предполагаю, что это должно сработать. Я хочу знать, как я могу решить эту проблему, связанную с разным хешированием и невозможностью проверить учетные данные пользователя.
Я пробовал, например, закодировать полученный пароль и использовать метод совпадений через мой автоматически подключенный парольEncoder, и я использую свой собственный authProvider.
Вот код, дайте мне знать, если вам понадобится что-нибудь еще.
CustomAuthProvider.java
Код: Выделить всё
@Service
public class CustomAuthProvider implements AuthenticationProvider {
private final UserServiceImpl userServiceImpl;
private final BCryptPasswordEncoder passwordEncoder;
@Autowired
public CustomAuthProvider(UserServiceImpl userServiceImpl, BCryptPasswordEncoder passwordEncoder) {
this.userServiceImpl = userServiceImpl;
this.passwordEncoder = passwordEncoder;
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = authentication.getCredentials().toString();
UserDetails userDetails = userServiceImpl.loadUserByUsername(username);
if (!passwordEncoder.matches(password, userDetails.getPassword())) { //The problem is here evidently.
throw new BadCredentialsException("Wrong password.");
}
return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
}
@Override
public boolean supports(Class authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
UserServiceImpl.java
Код: Выделить всё
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDTO user = this.getUserByUsername(username);
User anUser = convertToUser(user);
ModelMapper modelMapper = new ModelMapper();
return modelMapper.map(anUser,UserPrincipal.class);
}
}
Код: Выделить всё
@Override
public void save(UserDTO user) {
User aUser = this.convertToUser(user);
aUser.setPassword(passwordEncoder.encode(aUser.getPassword()));
this.userRepository.save(aUser); }
Код: Выделить всё
@RestController
public class LoginController{
private final CustomAuthProvider providerManager;
@Autowired
public LoginController(CustomAuthProvider providerManager) {
this.providerManager = providerManager;
}
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String login(@RequestParam("username") @NotBlank String username,
@RequestParam("password") @NotBlank String password, Model model) {
if(username == null || password == null) { //This is probably not necessary
model.addAttribute("error", "Invalid credentials");
return "login";
}
try {
Authentication auth = providerManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password)
);
SecurityContextHolder.getContext().setAuthentication(auth);
return "redirect:/notes";
} catch (AuthenticationException e) {
model.addAttribute("error", "Invalid credentials");
return "login";
}
}
}
Код: Выделить всё
@Data
public class UserPrincipal implements Serializable , UserDetails {
int id;
private String username;
private String password;
private Date accountCreationDate = new Date();
@Override
public Collection
Подробнее здесь: [url]https://stackoverflow.com/questions/75153947/built-in-spring-boot-bcrypt-matches-method-doesnt-work[/url]