Spring Security Custom UserDetails не аутентифицируется - PullRequest
0 голосов
/ 29 апреля 2018

экспериментируя с весенней загрузкой, безопасностью и данными.

я только что натолкнулся на этот сценарий:

Я использую H2 в памяти DB и постулирую его с одним пользователем с жидкой базой при запуске с именем пользователя и паролем.

Теперь я хочу, чтобы Spring Security проходил аутентификацию по H2. для этого у меня есть этот код:

@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsServiceImp);
 }

и я реализую userDetails следующим образом:

@Override
public UserDetails loadUserByUsername(String username) {
//this works, the user with pass is pulled
    com.fix.demo.logic.user.User byUsername = 
userRepository.findByUsername(username); 
    if (byUsername == null) {
        System.out.println("No user found with username: ");
        return null; //trow ex here
    }
    User user = new User(byUsername.getUsername(),
            byUsername.getPassword(), true, true,
            true, true, getAuthorities(Collections.singletonList("user")));
    //System.out.println(user.toString());
    //System.out.println(byUsername.toString()+ "   "+byUsername.getPassword());
        return user;
    }

но мои тесты продолжают проваливаться с

Аутентификация не должна быть нулевой

и попытка войти даст мне

неверные учетные данные

что необходимо для моей пользовательской реализации UserDetailsService?

это провальный тест:

@Test
public void loginWithValidUserThenAuthenticated() throws Exception {
    FormLoginRequestBuilder login = formLogin()
            .user("admin")
            .password("root");

    mockMvc.perform(login)
            .andExpect(authenticated().withUsername("admin"));
}

1 Ответ

0 голосов
/ 02 мая 2018

Одной из причин является то, что мой пароль может быть зашифрован, и вам необходимо указать Spring Security для использования кодера. Добавьте следующую строку в переопределение конфигурации.

auth.setPasswordEncoder(passwordEncoder());

определить бин passwordEncoder.

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
...