Как работать с запросом авторизации Spring HttpSecurity при наличии перекрестного пути? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть контроллер покоя, который имеет такие методы:

@RestController
@RequestMapping("/blogs")
class DummyController{
    @GetMapping("/{id}")
    public String dummy1(@PathVariable Long id){
        return "dummy1";
    }

    @GetMapping
    public String dummy2(){
        return "dummy2";
    }

    @GetMapping("/vote/status")
    public String dummy3(){
        return "dummy3";
    }
}

Здесь я хочу разрешить все запросы на dummy1 и dummy2, но аутентифицировать dummy3. Как видите, обнаженные дорожки имеют поперечную часть. Поэтому я настраиваю свою конфигурацию безопасности Spring следующим образом:

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

        http.authorizeRequests()
            .antMatchers(
    "/register",
                "/login",
                "/logout"
            ).permitAll()
            .antMatchers(
                HttpMethod.GET,
                "/blogs/vote/status"
            ).authenticated()
            .antMatchers(
                HttpMethod.GET,
                "/blogs",
                "/blogs/{id:\\d+}/**",
                "/blogs/search"
            ).permitAll()
            .anyRequest().authenticated()
            ;
    }

Конечно, это не сработало, я могу запросить dummy1, dummy2 и dummy3 без входа в систему.

Как мне настроить HttpSecurity для достижения желаемой стратегии аутентификации?

1 Ответ

0 голосов
/ 14 апреля 2020

Для этого я использую полномочия (или вы также можете использовать роли . Примерно так:

.antMatchers(
    HttpMethod.GET,
    "/blogs/vote/status"
).hasRole("ADMIN")

Или даже проще, в вашей конфигурации просто укажите путь, который вы не хотите исключать из аутентификации. Последняя часть .anyRequest (). authenticated () будет обрабатывать другие пути:

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

        http.authorizeRequests()
            .antMatchers(
    "/register",
                "/login",
                "/logout"
            ).permitAll()
            .antMatchers(
                HttpMethod.GET,
                "/blogs",
                "/blogs/{id:\\d+}/**",
                "/blogs/search"
            ).permitAll()
            .anyRequest().authenticated()
            ;
    }
...