【问题标题】:Can spring have multiple ConfigurerAdapter?spring可以有多个ConfigurerAdapter吗?
【发布时间】:2017-01-28 16:59:26
【问题描述】:

我需要使用 ldap 身份验证添加 OAuth2 安全性。 我首先实现了 ldap 身份验证并添加了一个WebSecurityConfigurerAdapter 实例。

@Configuration
@EnableWebSecurity
@Order(2)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and()
            .formLogin();
    }

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

    @Autowired
    public void configureGlobal(final AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .contextSource().url("ldaps://master:636/dc=domain,dc=com")
                .managerDn("cn=readonly,dc=domain,dc=com").managerPassword("123456")
                .and()
                .userSearchFilter("(uid={0})");
    }
}

我需要添加OAuth2资源服务器适配器ResourceServerConfigurerAdapter

@Configuration
@Import({ DatabaseConfig.class })
@EnableResourceServer
@Order(1)
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Autowired DatabaseConfig databaseConfig;

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).and().authorizeRequests()
                .anyRequest().authenticated();
    }


    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        // converter.setSigningKey("123");
        final Resource resource = new ClassPathResource("public.txt");
        String publicKey = null;
        try {
            publicKey = IOUtils.toString(resource.getInputStream());
        } catch (final IOException e) {
            throw new RuntimeException(e);
        }
        converter.setVerifierKey(publicKey);
        return converter;
    }

    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        return defaultTokenServices;
    }


    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(databaseConfig.dataSource());
    }

WebSecurityConfigurerAdapter 和 ResourceServerConfigurerAdapter 似乎在两者都配置时发生冲突。

我正在使用这两种 configure() 方法,但我只能在我的 Rest API 上使用 http://localhost:8080/login 通过 ldap 获取访问登录,并且无法使用我的 Angular 客户端使用 oauth http://localhost:8081/login

尝试访问资源时出现以下错误:

Failed to find refresh token for token eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJqb2huIiwic2NvcGUiOlsiZm9vIiwicmVhZCIsIndyaXRlIl0sIm9yZ2FuaXphdGlvbiI6ImpvaG5vRnZiIiwiYXRpIjoiNDcyZTJiNDYtZjgxZS00NGJiLWEwNDMtMGYwZmRjMDMzY2U1IiwiZXhwIjoxNDc2NTQ5NjYzLCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiN2UwNzRkZDktOWI0ZC00MTU0LWJjMzktMDlkY2U4Y2UyZTg2IiwiY2xpZW50X2lkIjoiZm9vQ2xpZW50SWRQYXNzd29yZCJ9.fuarTPL1O00Yg6b3BPibwux1ZtlmrHaPCJkgjsJni_51B3NEHkdB9kqbABK3IkMWMlZdqY8xfR-zMpY9SxFkpRFDfyvosgLcsTZ...
Handling error: InvalidGrantException, Invalid refresh token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVC...

【问题讨论】:

    标签: spring spring-security spring-boot spring-security-oauth2 spring-security-ldap


    【解决方案1】:

    我也有同样的问题。可能是我的解决方案并不优雅,但它对我有用。

    我尝试过 OAuth2ResourceServerConfig,它扩展了 WebSecurityConfig 并实现了 ResourceServerConfigurer。

    你的OAuth2ResourceServerConfig一定是这样的

    @Configuration
    @Import({ DatabaseConfig.class })
    @EnableResourceServer
    @Order(1)
    public class OAuth2ResourceServerConfig extends WebSecurityConfig implements ResourceServerConfigurer {
    
        @Autowired DatabaseConfig databaseConfig;
    
        @Override
        public void configure(final HttpSecurity http) throws Exception {
            http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED).and().authorizeRequests()
                    .anyRequest().authenticated();
        }
    
    
        @Bean
        public JwtAccessTokenConverter accessTokenConverter() {
            final JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
            // converter.setSigningKey("123");
            final Resource resource = new ClassPathResource("public.txt");
            String publicKey = null;
            try {
                publicKey = IOUtils.toString(resource.getInputStream());
            } catch (final IOException e) {
                throw new RuntimeException(e);
            }
            converter.setVerifierKey(publicKey);
            return converter;
        }
    
        @Bean
        @Primary
        public DefaultTokenServices tokenServices() {
            final DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
            defaultTokenServices.setTokenStore(tokenStore());
            return defaultTokenServices;
        }
    
    
        @Bean
        public TokenStore tokenStore() {
            return new JdbcTokenStore(databaseConfig.dataSource());
        }
    

    【讨论】:

      【解决方案2】:

      根据this post,我认为您可以通过将其添加到您的配置(yml 或属性)来使用以前的版本:

      security:
        oauth2:
          resource:
              filter-order: 3
      

      我尝试像您一样将@Order 注释添加到我的源服务器配置中,但遇到了同样的问题。所以,我认为@Order 注解不会对 ResourceServerConfigurerAdapter 生效,但它适用于 WebSecurityConfig。我不知道这是一个错误还是故意的。

      【讨论】:

        猜你喜欢
        • 2015-06-18
        • 2010-11-07
        • 2012-04-18
        • 2018-11-05
        • 2017-11-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2020-06-19
        相关资源
        最近更新 更多