403 доступ запрещен Spring Security каждый раз

Я получаю 403 на каждый запрос с шаблоном /admin Мне нужно ограничить /admin только для роли администратора.

Неудачный подход:

  1. Пробовал использовать @PreAuthorize(hasRole('ADMIN')) и @PreAuthorize(hasRole('ROLE_ADMIN')) на контроллере, но безуспешно.
  2. Пробовал удалить @PreAuthorize из контроллера и добавить шаблон в класс ниже с помощью hasRole, но безуспешно.

Ниже класс расширяется WebSecurityConfigurerAdapter

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

    @Autowired
    AuthenticationEntryPoint authenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .and()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            .authorizeRequests()

                .antMatchers(HttpMethod.OPTIONS).permitAll()
              .antMatchers(HttpMethod.GET,"/admin/**").hasAnyRole("ADMIN","ADMIN_TENANT")
                .anyRequest().authenticated()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf()
                .disable();
        httpSecurity.
            addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);

        httpSecurity.
            headers().cacheControl().disable();
    }

Уже пробовал решения, упомянутые в подобном вопросе, но не повезло. Поэтому, пожалуйста, не отмечайте его как дубликат.

Можете ли вы получить доступ к запросам, связанным с /admin, когда вы полностью удалите авторизацию? а также удалить HttpMethod.GET из антматчеров и проверить

venkat 02.04.2019 11:07

Да, при удалении /admin из antmatchers я могу получить к нему доступ, но мне нужна авторизация.

utsav anand 02.04.2019 11:17

Можете ли вы использовать свои antmatchers, например, "antMatchers("/admin/**").access("hasRole('ADMIN')") "?

venkat 02.04.2019 11:21

изменить hasAnyrole на hasAnyAuthority

kumar 02.04.2019 11:52

Также попытался изменить его на hasAnyAuthority, но это не сработало.

utsav anand 02.04.2019 12:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
425
2

Ответы 2

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

    @Autowired
    AuthenticationEntryPoint authenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .exceptionHandling()
                .authenticationEntryPoint(authenticationEntryPoint)
                .and()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            .authorizeRequests()

                .antMatchers(HttpMethod.OPTIONS).permitAll()
              .antMatchers(HttpMethod.GET,"/admin/**").hasAnyRole("ADMIN","ADMIN_TENANT") // change hasAnyrole to hasAnyAuthority
                .anyRequest().authenticated()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf()
                .disable();
        httpSecurity.
            addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);

        httpSecurity.
            headers().cacheControl().disable();
    }

почему, потому что если вы используете метод hasAnyRole, он автоматически добавит Role_ ко всем вещам, упомянутым в hasAnyRole

kumar 02.04.2019 11:54

Мой похожий проект Git: здесь

    // Config to check if already active
    http.authorizeRequests()
    .and() 
    .rememberMe()
    .tokenRepository(new JdbcTokenRepositoryImpl().setDataSource(//datasource_name) )
     .tokenValiditySeconds(//TimeInterval in sec); 

}

Другие вопросы по теме