#spring-security #spring-java-config
#spring-безопасность #spring-java-config
Вопрос:
В моем проекте Maven есть несколько интеграционных тестов, которые должны удовлетворять некоторым простым требованиям безопасности в памяти Spring.
У меня была эта конфигурация на основе XML, которая работает нормально, но теперь я хотел бы иметь ее в конфигурации на основе JavaConfig:
<!-- A REST authentication -->
<http use-expressions="true" pattern="/admin/**">
<intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
<http-basic entry-point-ref="restAuthenticationEntryPoint" />
<logout />
</http>
<!-- A hard coded authentication provider -->
<authentication-manager>
<authentication-provider>
<user-service>
<user name="stephane" password="mypassword" authorities="ROLE_ADMIN" />
</user-service>
</authentication-provider>
</authentication-manager>
Я попробовал следующую конфигурацию Java:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("stephane").password("mypassword").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic();
}
Но запросу GET отказано в доступе:
Неудачные тесты: testGreetingSucceedsWithCorrectUserCredentials(com.thalasoft.learnintouch.rest.AdminControllerTest): Ожидаемый статус: <200> но было: <401>
Есть какие-нибудь подсказки?
С уважением,
Стефан Эйберт
Ответ №1:
Я мог бы исправить безопасность с помощью следующей конфигурации:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("stephane").password("mypassword").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.httpBasic()
.authenticationEntryPoint(restAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/**").hasRole("ADMIN")
.anyRequest().authenticated();
}
Мне не хватало конфигурации .AuthenticationEntryPoint(restAuthenticationEntryPoint) и .csrf().disable().
Теперь тесты проходят, как и ожидалось.