2017-02-18 21 views
3

Я настраиваю Spring Security. Для аутентификации и авторизации пользователей я переопределяю configure(AuthenticationManagerBuilder auth) из WebSecurityConfigurerAdapter. Это прекрасно работает. Ниже мой код:Spring Security: configure (AuthenticationManagerBuilder auth) vs authenticationManagerBean()

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth 
     .userDetailsService(customUserDetailsService) 
     .passwordEncoder(getPasswordEncoder()); 
} 

Но когда я пытаюсь включить защиту на уровень методы, в действие, используя @EnableGlobalMethodSecurity(securedEnabled = true) он бросает исключение:

Нет AuthenticationManager найденного

В соответствии с мое понимание AuthenticationManager используется для аутентификации и авторизации пользователей, которые я уже делал, используя configure(AuthenticationManagerBuilder auth), а Spring вводил auth сам объект.

Почему мне нужно зарегистрировать AuthenticationManager вручную?

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

Каковы differennt цели configure(AuthenticationManagerBuilder auth) и authenticationManagerBean() предлагается?

Я расширяю WebSecurityConfigurerAdapter. Почему мне нужно предоставить пользовательский код AuthenticationManager, переопределив authenticationManagerBean().

ответ

2

Ваш класс конфигурации расширяет WebSecurityConfigurerAdapter, которая только настраивает веб-безопасность (не метод защиты):

обеспечивает удобный базовый класс для создания WebSecurityConfigurer экземпляра. Реализация позволяет настраивать путем переопределения методов.

Таким образом, ваш AuthenticationManager предназначен для веб-безопасности.

Если вы хотите настроить (изменить) по умолчанию безопасность метода, вы можете продлить GlobalMethodSecurityConfiguration:

Base Configuration для обеспечения глобальной безопасности метода. Классы могут расширять этот класс, чтобы настроить параметры по умолчанию, но обязательно должны указать аннотацию EnableGlobalMethodSecurity в подклассе.

Чтобы настроить AuthenticationManager для безопасности метода, вы можете

  1. перезаписать GlobalMethodSecurityConfiguration#configure:

    Sub классы могут переопределить этот метод для регистрации различных типов аутентификации. Если не переопределено, то configure(AuthenticationManagerBuilder) будет пытаться выполнить аутологию по типу.

  2. разоблачить ваш AuthenticationManager как боб, который может быть autowired по GlobalMethodSecurityConfiguration см WebSecurityConfigurerAdapter#authenticationManagerBean:

    Override этот метод, чтобы разоблачить AuthenticationManager от configure(AuthenticationManagerBuilder) быть разоблачен как Bean.

  3. использовать только один глобальный AuthenticationManager по автоматическому связыванию глобального AuthenticationManagerBuild см Spring Security 3.2.0.RC2 Released:

    Например, если вы хотите настроить глобальную проверку подлинности (то есть у вас есть только один AuthenticationManager) вы должны autowire AuthenticationMangerBuilder:

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) { 
        // ... configure it ... 
    }