Spring Security:configure(AuthenticationManagerBuilder auth)vs authenticationManagerBean()

时间:2017-02-18 14:47:00

标签: spring spring-mvc authentication spring-security

我正在配置Spring Security。要对用户进行身份验证和授权,请覆盖configure(AuthenticationManagerBuilder auth)的{​​{1}}。这很好用。以下是我的代码:

WebSecurityConfigurerAdapter

但是当我尝试启用方法级别的安全性时,每个操作使用@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(customUserDetailsService) .passwordEncoder(getPasswordEncoder()); } 会引发异常:

  

未找到AuthenticationManager

根据我的理解@EnableGlobalMethodSecurity(securedEnabled = true)用于对用户进行身份验证和授权,我已经使用AuthenticationManager进行了操作,而Spring正在注入configure(AuthenticationManagerBuilder auth)对象本身。

为什么我需要手动注册auth

AuthenticationManager

@Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } configure(AuthenticationManagerBuilder auth)有哪些不同用途?

我正在延长authenticationManagerBean()。为什么我需要通过覆盖WebSecurityConfigurerAdapter来提供自定义AuthenticationManager

1 个答案:

答案 0 :(得分:4)

您的配置类扩展WebSecurityConfigurerAdapter,它只配置Web安全性(不是方法安全性):

  

为创建WebSecurityConfigurer实例提供方便的基类。该实现允许通过重写方法进行自定义。

因此,您的AuthenticationManager仅用于网络安全。

如果要配置(更改默认值)方法安全性,可以扩展GlobalMethodSecurityConfiguration

  

用于启用全局方法安全性的基础Configuration。类可以扩展此类以自定义默认值,但必须确保在子类上指定EnableGlobalMethodSecurity注释。

要为方法安全配置AuthenticationManager,您可以

  1. 覆盖GlobalMethodSecurityConfiguration#configure

      

    子类可以覆盖此方法以注册不同类型的身份验证。如果未被覆盖,configure(AuthenticationManagerBuilder)将尝试按类型自动装配。

  2. 将您的AuthenticationManager公开为可由GlobalMethodSecurityConfiguration自动装配的bean,请参阅WebSecurityConfigurerAdapter#authenticationManagerBean

      

    重写此方法以将AuthenticationManagerconfigure(AuthenticationManagerBuilder)公开,以显示为Bean。

  3. 通过自动装配全局AuthenticationManager,只使用一个全局AuthenticationManagerBuild,请参阅Spring Security 3.2.0.RC2 Released

      

    例如,如果要配置全局身份验证(即只有一个AuthenticationManager),则应自动连接AuthenticationMangerBuilder:

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