Как включить Java Spring безопасности только на пути, определенные в определенном контроллере? - PullRequest
0 голосов
/ 12 февраля 2020

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

Вот моя текущая конфигурация SecurityConfiguration:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .antMatcher("/api/v1/**").addFilterBefore(
                    new AuthenticationFilter(myAuthenticator()),
                    ChannelProcessingFilter.class);

    }
}

В моем контроллере у меня есть /api/v1/user, /api/v1/user/{userId}. Когда я пытаюсь получить доступ к неверному пути, например, /api/v1/invalid, я всегда получаю 401 вместо 404, так как любой путь, начинающийся с /api/v1, сначала будет проходить через go через AuthenticationFilter. Это также происходило, когда я пытаюсь использовать неподдерживаемый метод HTTP в существующем пути, мое приложение будет возвращать 401, а не 405.

Я хочу добиться чего-то вроде добавления аннотации на уровне контроллера (или уровне метода). также подходит), и применять фильтр аутентификации только к путям, определенным в этом контроллере, например

@WhateverAnnotationWillAddFilterToThisController***
@RestController
@RequestMapping(value = "/api/v1", produces = "application/json")
public interface LicensingController {

    @RequestMapping(value = "user", method = RequestMethod.POST)
    public ResponseEntity<?> user();

    @RequestMapping(value = "user/{userId}", method = RequestMethod.GET)
    public ResponseEntity<LicensingRequest> getUser(
        @PathVariable
        String userId);
}

. Любые рекомендации будут оценены. Спасибо!

1 Ответ

1 голос
/ 12 февраля 2020

Поведение является правильным и непротиворечивым, потому что вы используете /api/v1/** для обеспечения безопасности, что является более широким путем. В идеале AuthenticationFilter всегда остается выше пути к ресурсу, чтобы избежать доступа к ресурсу, если он не прошел проверку подлинности.

Чтобы получить 404, вы используете более узкое сопоставление пути.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .antMatchers("/api/v1/user", "/api/v1/user/{userId}").addFilterBefore(
                    new AuthenticationFilter(myAuthenticator()),
                    ChannelProcessingFilter.class);

    }
}

Если вы хотите ограничения уровня HTTP-метода, вы также должны указать это.

...