Простая демонстрация для Spring Security с JavaConfig

#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().

Теперь тесты проходят, как и ожидалось.