【问题标题】:Autowiring Spring Authentication Manager in Java Config在 Java Config 中自动装配 Spring 身份验证管理器
【发布时间】:2021-04-09 02:48:15
【问题描述】:

我设置了自定义身份验证提供程序:

@Configuration
@EnableWebSecurity
@EnableGlobalAuthentication
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    @Qualifier("samlAuthenticationProvider")
    SAMLAuthenticationProvider samlAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         * Do your stuff here
         */
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(samlAuthenticationProvider);
    }   

}

现在,我还想为身份验证管理器设置一个别名,然后我想在另一个 bean 定义中自动装配它。

例如:

<!-- Register authentication manager with SAML provider -->
<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider
        ref="samlAuthenticationProvider" />
</security:authentication-manager>

<!-- Processing filter for WebSSO Holder-of-Key profile -->
<bean id="samlWebSSOHoKProcessingFilter"
    class="org.springframework.security.saml.SAMLWebSSOHoKProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="authenticationSuccessHandler" ref="successRedirectHandler" />
</bean>

有没有办法只在 Java Config 中做到这一点?

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    我对新的安全 Java 配置不太满意,但这是我从源代码中看到的:

    @Import(AuthenticationConfiguration.class)
    public @interface EnableGlobalAuthentication {}
    

    这个注解也导入了AuthenticationConfiguration,他也是@Configuration。任何@Configuration 也被注册为bean。所以,你可以从WebSecurityConfigurerAdapter 这样做:

    @Autowired
    public void setAuthenticationConfiguration(AuthenticationConfiguration authenticationConfiguration) {
         this.authenticationConfiguration = authenticationConfiguration;
    }
    

    并访问AuthenticationManager

    this.authenticationConfiguration.getAuthenticationManager();
    

    从 xml 的角度来看,您可以使用 SpEL 来访问该authenticationManager

    <property name="authenticationManager" value="#{authenticationConfiguration.authenticationManager}" />
    

    抱歉,我没有看到 AuthenticationManager 注册为 bean 的重点。从这里你不能为他配置一个别名

    更新

    顺便说一句,如果您打算将@Autowired AuthenticationManager 转到其他组件,@Value 来解决问题:

    @Value("#{authenticationConfiguration.authenticationManager}")
    private AuthenticationManager authenticationManager;
    

    更新2

    找到它WebSecurityConfigurerAdapter。源代码和JavaDocs:

    /**
     * Override this method to expose the {@link AuthenticationManager} from
     * {@link #configure(AuthenticationManagerBuilder)} to be exposed as
     * a Bean. For example:
     *
     * <pre>
     * &#064;Bean(name name="myAuthenticationManager")
     * &#064;Override
     * public AuthenticationManager authenticationManagerBean() throws Exception {
     *     return super.authenticationManagerBean();
     * }
     * </pre>
     *
     * @return the {@link AuthenticationManager}
     * @throws Exception
     */
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return new AuthenticationManagerDelegator(authenticationBuilder);
    }
    

    UPDATE3

    如何从自定义WebSecurityConfigurerAdapter 访问现有AuthenticationManager 并配置SAMLWebSSOHoKProcessingFilter

    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
      @Bean
      public SAMLWebSSOHoKProcessingFilter samlFilter() {
        SAMLWebSSOHoKProcessingFilter samlFilter = new SAMLWebSSOHoKProcessingFilter();
        samlFilter.setAuthenticationManage(authenticationManager());
        .......
        return samlFilter;
      }
    
      @Override  
      protected void configure(HttpSecurity http) throws Exception {
          http.addFilter(samlFilter());
      }
    }
    

    【讨论】:

    • 首先,谢谢。我想完全避免使用 XML:有办法吗?
    • 添加了@Value 注射样品
    • 对,当然。这正是那个 JavaDoc 的结果
    • 如何通过该方法执行此操作:return this.authenticationConfiguration.getAuthenticationManager();?但是从这里需要查看您的WebSecurityConfigurerAdapter 实现
    • 我有一个 NullPointerException
    【解决方案2】:

    这对我有用:

    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            ...
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            ...
        }
    
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
    }
    

    @Component
    public class UsernamePasswordAuth extends UsernamePasswordAuthenticationFilter {
    
        @Autowired
        public UsernamePasswordAuth(AuthenticationManager authenticationManager) {
            setAuthenticationManager(authenticationManager);
    
            setFilterProcessesUrl("/api/services/login");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 2015-10-27
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      相关资源
      最近更新 更多