Безопасность уровня метода JSR 250 не работает в Spring MVC

Я пытаюсь отойти от @Configuration безопасность на основе метода уровня защиты JSR 250. Код ниже работает следующим образом:

Доступ к моей странице настроен в configure(HttpSecurity http) внутри SecurityConfiguration.class, Каждый может получить доступ к странице "все", если кто-то пытается "защищен", то отображается страница входа по умолчанию, если роль неверна, то отображается сообщение "Доступ запрещен". Хорошо.

Теперь я хотел бы сделать то же самое, но с использованием аннотаций JSR 250. Так:

Я удалил configure(HttpSecurity http) метод, добавленный в конфигурацию контекста сервлета диспетчера

@EnableGlobalMethodSecurity(jsr250Enabled = true, proxyTargetClass = true, mode = AdviceMode.ASPECTJ, prePostEnabled=true)

и, очевидно, @PermitAll а также @RolesAllowed внутри контроллера.

Эти изменения не работают должным образом. Если я пытаюсь получить доступ к любой странице, которую меня спрашивают об учетных данных (страница входа по умолчанию), если я заполняю их, я могу получить доступ к любой странице в любой роли:(

Я забыл о чем-то?

Заранее благодарю за любую помощь, которую вы можете оказать, Марек

Контекст приложения:

@Import(SecurityConfiguration.class)
public class AppConfiguration {
  // entityManagerFactory, transactionManager, localValidatorFactoryBean, methodValidationPostProcessor 
}

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

  @Inject
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("marek").password("123456").roles("USER");
    auth.inMemoryAuthentication().withUser("bill").password("123456").roles("ADMIN");
    auth.inMemoryAuthentication().withUser("james").password("123456").roles("SUPERADMIN");
  }

  @Bean
  @Override
  public AuthenticationManager authenticationManagerBean() throws Exception {
    return super.authenticationManagerBean();
  }

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

    http.authorizeRequests().antMatchers("/all**").permitAll();
    http.authorizeRequests().antMatchers("/protected/**").access("hasRole('ROLE_ADMIN')");
    http.authorizeRequests().antMatchers("/confidential/**").access("hasRole('ROLE_SUPERADMIN')");
    http.authorizeRequests().and().formLogin();
}

WebApplicationContext:

@Configuration
@EnableWebMvc
@EnableGlobalMethodSecurity(jsr250Enabled = true, proxyTargetClass = true, mode = AdviceMode.ASPECTJ, prePostEnabled=true)
@ComponentScan(basePackages = "xxx.xxx.controllers")
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
  // addInterceptors, addViewControllers, templateResolver, templateEngine, thymeleafViewResolver
}

контроллер:

@Controller
public class HomeController {
  @PermitAll
  @RequestMapping(value = "/all**", method = RequestMethod.GET)
  public String allPage(Model model) {
    return "all";
  }

  @RolesAllowed("ADMIN")
  @RequestMapping(value = "/protected**", method = RequestMethod.GET)
  public String protectedPage(Model model) {
    return "protected";
  }

  @RolesAllowed("SUPERADMIN")
  @RequestMapping(value = "/confidential**", method = RequestMethod.GET)
  public String superAdminPage(Model model) {
    return "confidential";
  }
}

зависимости:

<appengine.target.version>1.9.18</appengine.target.version>
<javax.servlet-api.version>3.1.0</javax.servlet-api.version>
<javax.jsr250-api.version>1.0</javax.jsr250-api.version>
<spring.version>4.1.5.RELEASE</spring.version>
<spring.security.version>3.2.6.RELEASE</spring.security.version>
<spring.thymeleaf.version>2.1.4.RELEASE</spring.thymeleaf.version>
<aspectj.version>1.8.5</aspectj.version>

1 ответ

Решение

Я заметил, что ваша аннотация @ EnableGlobalMethodSecurity использует прокси-режим AdviceMode.ASPECTJ, но в ваших зависимостях нет AspectJ.

Если вы пытаетесь использовать прокси-серверы AspectJ, вам нужно предоставить зависимость и добавить конфигурацию для компиляции с использованием компилятора AspectJ.

Если вы не собираетесь использовать прокси AspectJ, попробуйте без параметра 'mode = AdviceMode.ASPECTJ'.

Изменить - это может быть не очевидно. Для использования прокси AspectJ вам необходимо:

  1. указать зависимости
  2. предоставить конфигурацию плагина aspectj для компиляции с компилятором AspectJ

Вот пример конфигурации maven: Запуск JDK8 для aspectj

Вот один для gradle: https://github.com/jigishpa/spring-samples/blob/master/aop/hello/build.gradle

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