Spring Security permitAll() для одного URL под некоторым шаблоном

У меня есть/my-app / login url, и я хочу permitAll() для этого URL. Но эта страница под/ my-app / ** pattern, которые позволяют доступ только для зарегистрированных пользователей.

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

                .csrf().disable()
                .authorizeRequests()
                    .antMatchers("/my-app/**").access("hasRole('USER')")
                    .and()
                .httpBasic()
                .authenticationEntryPoint(entryPoint());
    }

Как это сделать?

1 ответ

  1. Добавить .antMatchers("/my-app/login").permitAll()перед .antMatchers("/my-app/**").... Сопоставители запросов хранятся в списке (упорядоченном по порядку, в котором они определены), и Spring security будет использовать Первое правило, которое сопоставители соответствуют текущему запросу. Поэтому сначала поставьте самые конкретные, а потом общие правила.

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
    
                .csrf().disable()
                .authorizeRequests()
                    .antMatchers("/my-app/login").permitAll()
                    .antMatchers("/my-app/**").access("hasRole('USER')")
                    .and()
                .httpBasic()
                .authenticationEntryPoint(entryPoint());
    }
    

    Если my-appэто имя вашего приложения, и, следовательно, url, который является вашим сервером приложений (Tomcat), чтобы сопоставить url-адрес с приложением, то вы должны ommit его вantMatcher, Потому antMatcherчто настроен» только » относительным url-адресом приложения: /my-app/loginстать /loginи /my-app/**стать /**

    добавить .anyRequest().permitAll()как последний «matcher» из authorizeRequests()

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
    
                .csrf().disable()
                .authorizeRequests()
                    .antMatchers("/my-app/**").access("hasRole('USER')")
                    .anyRequest().permitAll()
                    .and()
                .httpBasic()
                .authenticationEntryPoint(entryPoint());
    }
    

    Но если честно: вы используете какой — то черный список (разрешите все url, кроме некоторых черных списков) — и это не рекомендуемый способ (с точки зрения безопасности). Потому что если вы забыли добавить или неправильно написать один URL, который должен быть защищен, то он доступен для каждого тела. Более безопасный способ-запретить каждый url и разрешить только некоторые (белый список).