В Spring Security нельзя получить username и password привычными методами. После аутентификации запроса, данные обычно хранятся в локальном потоке SecurityContext, управляемом SecurityContextHolder. А чтоб достать username и password, нужно переопределить метод "Authentication" в классе AuthenticationProvider ("прослойка" между базой данных и клиентом, вшитая в Spring Security):
@Component
public class CustomAuthencationProvider implements AuthenticationProvider {
@Autowired
private CustomPersonRepository DAO;
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String userName = authentication.getName();
String password = authentication.getCredentials().toString();
Person myUser = DAO.findByUsername(userName);
if (myUser == null) {
throw new BadCredentialsException("Unknown user "+userName);
}
if (!password.equals(myUser.getPassword())) {
throw new BadCredentialsException("Bad password");
}
UserDetails principal = User.builder()
.username(myUser.getLogin())
.password(myUser.getPassword())
.roles(myUser.getLogin())
.build();
return new UsernamePasswordAuthenticationToken(
principal, password, principal.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
Спринг работает на прямую с объектами "User" хранящимися в базе данных (или в локальном репозитории) и автоматизирует процесс обмена данными до уровня "запрос - ответ", а в контексте происходит аутентификация (кодирование/декодирование + проверка). То есть, хождение по сайту, подразумевает постоянный обмен пакетами данных сервера и клиента, между которыми существует прослойка "проверка" (аутентификация) реализованная в Spring Security. И если нам нужно что-то достать, то нужно реализовать методы спринга. В идеале, даже разработчик не должен видеть личные данные пользователя.
Пароль в Spring Security по умолчанию закодирован на уровне контекста. И если мы хотим убрать кодирование (не рекомендуется), то нужно в классе конфигурации
SecurityConfig implements WebMvcConfigurer
указать соответствующий бин:
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
Пользовательская аутентификация в Spring Security