Как сделать так, чтобы несколько WebSecurityConfigurerAdapters работали вместе? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть два файла конфигурации в двух разных проектах Первый:

 @Configuration
@Order(2)
public class SecurityConfig {

    /**адрес сервера LDAP*/
    @Value("${ldap.server}")
    private String ldapServer;

    /**номер порта LDAP сервера*/
    @Value("${ldap.port}")
    private int ldapPort;

    /**домен для LDAP*/
    @Value("${ldap.suffix}")
    private String suffix;

    @Autowired
    private HttpSecurity httpSecurity;

    @PostConstruct
    public void init() throws Exception {
        httpSecurity
            .httpBasic()
            .and()
            .authorizeRequests().antMatchers("/**").authenticated()
            .and()
            .authenticationProvider(adAuthProvider())     
            .csrf().disable();      
    }

    /**провайдер для аутентификации через LDAP*/
    @Bean
    public ActiveDirectoryLdapAuthenticationProvider adAuthProvider() {

        String ldapUrl = String.format("ldap://%s:%s", ldapServer, ldapPort);

        ActiveDirectoryLdapAuthenticationProvider adAuthProvider = new ActiveDirectoryLdapAuthenticationProvider(suffix, ldapUrl);
        adAuthProvider.setConvertSubErrorCodesToExceptions(true);
        adAuthProvider.setUseAuthenticationRequestCredentials(true);
        return adAuthProvider;
    }

}

И второй:

    @Configuration
@Order(3)
public class ECommonConfig extends WebSecurityConfigurerAdapter{

    @Autowired
    private HttpSecurity httpSecurity;

    @Autowired
    private UserDetailsService userDetailsService;

    @Bean(name = "requestAuthorization")
    public RequestAuthorization requestAuthorization() {
        return new RequestAuthorization();
    }

    /**провайдер для аутентификации через базу данных*/
    @Bean
    public DaoAuthenticationProvider jdbcAuthProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    /**бин для шифрования паролей*/
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    /**бин для фильтра проверки наличия LDAP-пользователя в базе данных*/
    @Bean
    public LDAPAuthenticationFilter ldapAuthenticationFilter() throws Exception {
        return new LDAPAuthenticationFilter(authenticationManager());
    }

    @PostConstruct
    public void init() throws Exception {
        httpSecurity.httpBasic()
            .and()
            .authorizeRequests().antMatchers("/**").authenticated()
            .and()
            .authenticationProvider(jdbcAuthProvider())
            .csrf().disable();
        httpSecurity.addFilterAt(ldapAuthenticationFilter(), LDAPAuthenticationFilter.class);
        httpSecurity.authorizeRequests().antMatchers("/**").access("@requestAuthorization.checkRequestPermissions(authentication, request)");
    }
}

и MainConfig в основном проекте

@Configuration
@EnableWebSecurity
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class MainConfig extends WebSecurityConfigurerAdapter{

    @Bean(name = "httpSecurity")
    public HttpSecurity httpSecurity() throws Exception {
        return getHttp();
    }       
}

Работает только аутентификация. Фильтр и .access не работают. Ошибки не отображаются. Я использовал debug - фильтры и бин @requestAuthorization даже не использовали

Эти два класса конфигурации размещены в разных проектах и ​​требуют двух совместных работ (если включены оба проекта) или одного из них (если включен один из этих проектов).

Как я могу заставить эти два класса конфигурации работать вместе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...