Как защитить веб-сервис REST с помощью Spring, DELETE возможен, хотя я не авторизовал его - PullRequest
0 голосов
/ 09 мая 2019

Я настраиваю конфигурацию безопасности в Spring и хочу, чтобы только пользователь мог получить доступ к ресурсам, которые я написал в конфигурации. Если я не написал DELETE, я не хочу, чтобы кто-нибудь из пользователей мог использовать этот запрос, например, это самое ограничительное, если я не добавлю это. Что я должен изменить в своем коде?

Я написал следующий код. GET и POST в порядке, но я могу удалить и не добавляю это разрешение.

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityJavaConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()                             
                .withUser("user")
                    .password(encoder().encode("passExample"))
                    .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .httpBasic()
                .and()
            .csrf()
                .disable()
            .authorizeRequests()
                .antMatchers(HttpMethod.GET, "/**").hasRole("USER")
                .antMatchers(HttpMethod.POST, "/**").hasRole("USER")
                .and()
            .formLogin()
                .permitAll();

....

Я ожидал, что если я сделаю запрос с DELETE, приложение не разрешит, потому что я не авторизовал его.

curl -X Delete locahost/servicio/1
{
    "timestamp": "2019-05-09T17:43:30.253+0000",
    "status": 401,
    "error": "Unauthorized",
    "message": "Unauthorized",
    "path": "/service"
}

Но фактическим выводом является состояние 204. Сервер успешно обработал запрос.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы должны ограничить любой другой запрос, см. Ссылка на Spring Security :

6.4 Авторизация запросов

В наших примерах требуется только аутентификация пользователей, и они выполняются для каждого URL в нашем приложении. Мы можем указать пользовательские требования для наших URL-адресов, добавив несколько дочерних элементов в наш метод http.authorizeRequests (). Например:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()                                                                1
            .antMatchers("/resources/**", "/signup", "/about").permitAll()                  2
            .antMatchers("/admin/**").hasRole("ADMIN")                                      3
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")            4
            .anyRequest().authenticated()                                                   5
            .and()
        // ...
        .formLogin();
}
  1. У метода http.authorizeRequests() есть несколько дочерних элементов, каждый сопоставитель рассматривается в том порядке, в котором они были объявлены.

  2. Мы указали несколько шаблонов URL, к которым может получить доступ любой пользователь. В частности, любой пользователь может получить доступ к запросу, если URL начинается с "/ resources /", равно "/ signup" или равно "/about".

  3. Любой URL-адрес, начинающийся с "/ admin /", будет доступен только пользователям, имеющим роль "ROLE_ADMIN". Вы заметите, что, поскольку мы вызываем метод hasRole, нам не нужно указывать префикс «ROLE_».

  4. Любой URL, начинающийся с "/ db /", требует, чтобы у пользователя были и ROLE_ADMIN, и ROLE_DBA. Вы заметите, что, поскольку мы используем выражение hasRole, нам не нужно указывать префикс «ROLE_».

  5. Любой URL, который еще не был найден, требует только аутентификации пользователя

и см. ExpressionUrlAuthorizationConfigurer#denyAll:

denyAll

public ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry denyAll()

Укажите, что URL никому не разрешены.

Ваш модифицированный код:

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
        .httpBasic()
            .and()
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers(HttpMethod.GET, "/**").hasRole("USER")
            .antMatchers(HttpMethod.POST, "/**").hasRole("USER")
            .anyRequest().denyAll()
            .and()
        .formLogin()
            .permitAll();
}
0 голосов
/ 10 мая 2019

Вы настроили любой запрос GET и POST к любым конечным точкам, который должен иметь роль пользователя ROLE_USER и разрешать все другие типы запросов, такие как (DELETE, HEAD, PUT и т. Д..).Попробуйте отклонить все другие типы запросов.

.antMatchers("/**").denyAll(); или .anyRequest().denyAll();

Обратите внимание, что порядок имеет значение здесь.Если вы укажете это до запроса GET или POST, все запросы будут отклонены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...