Spring 安全性:将自关闭身份验证管理器 xml 标记迁移到 Java 配置

Spring Security: Migrating Self Closing Authentication Manager xml Tag to Java Config

我有一个相当开箱即用的 Spring Security 3.2 J2EE xml 配置,我几乎已经完成转换为 Java 配置。

之前的 xml 文件:

<sec:global-method-security pre-post-annotations="enabled" />
<sec:authentication-manager />

<sec:http pattern="/css/**" security="none" />
<sec:http pattern="/js/**" security="none" />
....
<sec:http auto-config="true" create-session="never" use-expressions="true>
    <sec:session-management session-fixation-protection="none" />
    <sec:jee mappable-roles="admin,user" />
    <sec:intercept-url pattern="/operations/admin/**" access="hasRole('ROLE_admin')" />
    <sec:intercept-url pattern="/**" access="permitAll" />
</sec:http>

自动关闭身份验证管理器标签是我的问题。它正在获取由 jee 标签创建的 PreAuthenticatedAuthenticationProvider。我不太确定如何在 Java 配置中复制它:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
@ImportResource("classpath:security-context.xml")
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter{
    @Override
    public void configure(WebSecurity web) throws Exception{
        web
            .ignoring.antMatchers("/css/**")
            .and()
            .ignoring.antMatchers("/js/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http
            .sessionManagement()
            .sessionFixation().none()
            .sessionCreationPolicy(SessionCreationPolicy.NEVER)
        .and()
        .csrf().disable()
        .jee()
            .mappableAuthorities("admin","user")
        .and()
        .authorizeRequests()
            .antMatchers("/operations/admin/**").hasAuthority("admin")
            .anyRequest.permitAll();
    }
}

这现在可以正常工作了,因为我正在导入我的旧安全性-context.xml,它除了身份验证管理器标签外什么都没有。

我一直在尝试声明 AuthenticationManagerBuilder bean,但似乎所有内容都需要对 AuthenticationProvider 或 UserDetailsS​​ervice 的特定引用才能工作。 ProviderManager 默认构造函数已弃用。

我知道 jee() 条目将 PreAuthenticatedAuthenticationProvider 添加到 HttpSecurity 中的 sharedObjects,因此我可以在必要时解决从 sharedObjects 中获取 PreAuthenticatedAuthenticationProvider 以创建 AuthenticationManager 的麻烦,但似乎应该作为一个简单的 Java 配置对应于我刚刚缺少的自动关闭 xml 标签。

你能在你的 SpringSecurityConfig 上试试吗 class :-

@Autowired
public void registerGlobal(AuthenticationManagerBuilder auth) throws Exception {
   auth.authenticationProvider(new AuthenticationManagerBeanDefinitionParser.NullAuthenticationProvider());
}