2015-05-29 5 views
6

Я пытаюсь использовать URL (муравей основе) соответствия вместе с @PreAuthorize ("permitAll") на некоторые контроллеры, т.е.Spring Security @PreAuthorize на контроллерах

@Controller 
@RequestMapping("/register") 
public class RegistrationController { 
... 

    @PreAuthorize("permitAll") 
    @RequestMapping(method = RequestMethod.GET) 
    public String register() { ... } 

SecurityConfig:

@Configuration 
@EnableWebMvcSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     // @formatter:off 
     http 
      .authorizeRequests() 
       .antMatchers("/").permitAll() 
       .anyRequest().authenticated() 

Я также попытался добавить @EnableGlobalMethodSecurity в мой MVC конфигурации:

@Configuration 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class MvcConfig extends WebMvcConfigurerAdapter { ... } 

Но это не имеет никакого эффекта

Однако я все еще запрашиваю аутентификацию при попадании/регистрации. Если я добавлю «/ register» к муравьям, он работает, то есть .antMatchers («/», «/ register»). AllowAll()

Что мне здесь не хватает? Кажется, @PreAuthorize не влияет на мои контроллеры.

+0

Я должен уточнить, что @PreAuthorize ("hasRole ('ADMIN')") на контроллере действительно работает: не администраторы получат ошибку 403. Проблема заключается в том, как переопределить муравьиный мусор с аннотацией @PreAuthorize. –

ответ

8

Вы не можете этого сделать, потому что муравьиные муравьи и @PreAuthorize работают на разном уровне.

Муравейник работает на http уровень безопасности. Фильтр безопасности Spring смотрит на запрос, и если он обнаруживает, что доступ должен быть отклонен, он даже не передает запрос сервле диспетчеру и напрямую отправляет ошибку 403.

PreAuthorize работа на метод уровень. Когда метод будет вызван, прокси-сервер AOP контролирует, должен ли разрешаться доступ. Таким образом, уровень 2 авторизации равен прикованным, вместо второго переопределения первого.

Во всяком случае, я настоятельно советую вам неиспользовать @PreAuthorize("hasRole('ADMIN')") на контроллере:

  • легко можно сделать с помощью простой муравьиной согласовани
  • это заставляет вас позволить проксирование на контроллере, либо с классом проксированием вместо JDK проксирование или с помощью интерфейсов для контроллеров

ИМХО, @PreAuthorize лучше всего подходит на уровне сервиса, потому что вы можете смешивать область о bjects с полномочиями, предоставленными пользователем, для получения штрафных разрешений.

+1

Thanls Serge. Причина, по которой я планировал использовать аннотации, заключалась в том, чтобы упростить и обслуживать вещи, на данный момент мне нужно отобразить «/ register», «/ register/"и"/register/* "в конфиге безопасности, и если я изменил отображение запроса, мне также нужно будет их изменить. –

Смежные вопросы