Тестирование конфигурации Spring Boot Security
Я сделал очень простое демонстрационное приложение для тестирования безопасности Spring Boot.
Это моя конфигурация приложения
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
@SpringBootApplication
public class DemoApplication extends WebSecurityConfigurerAdapter {
@Autowired
private SecurityService securityService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(securityService);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().fullyAuthenticated();
http.httpBasic();
http.csrf().disable();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Моя реализация UserDetailsService принимает всех пользователей с паролем "пароль", которым предоставлена роль администратора пользователю "admin".
@Service
public class SecurityService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Collection<GrantedAuthority> authorities;
if (username.equals("admin")) {
authorities = Arrays.asList(() -> "ROLE_ADMIN", () -> "ROLE_BASIC");
} else {
authorities = Arrays.asList(() -> "ROLE_BASIC");
}
return new User(username, "password", authorities);
}
}
И я наконец создал простой тест для проверки:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = DemoApplication.class)
@WebAppConfiguration
public class DemoApplicationTests {
@Autowired
private AuthenticationManager authenticationManager;
@Test
public void thatAuthManagerUsesMyService() {
Authentication auth = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken("admin", "password")
);
assertTrue(auth.isAuthenticated());
}
}
Я ожидал, что тест пройден, но вместо этого я получил исключение BadCredentialsException. После отладки я понял, что AuthenticationManager, введенный Spring в тесте, не тот, который я настроил. При копании объекта в отладчике затмения я увидел, что UserDetailsServer был InMemoryUserDetailsManager.
Я также проверил, что методы configure() в DemoApplication вызываются. Что я делаю неправильно?
1 ответ
Для ссылки API API WebSecurityConfigurerAdapter для authenticationManagerBean()
Переопределите этот метод, чтобы представить AuthenticationManager из configure(AuthenticationManagerBuilder), который будет представлен как Bean-компонент.
Так что просто переопределите authenticationManagerBean()
в вашем WebSecurityConfigurerAdapter и выставьте его как компонент с @Bean
,
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}