java - Spring Security OAuth Java 配置

标签 java spring spring-mvc spring-security spring-oauth2

我有一个 Spring 应用程序——不是一个 Spring Boot 应用程序——我试图将 API 的一部分声明为使用 Spring Security 保护的 OAuth2。当我定义 http 时,我的授权和一般资源访问配置工作得很好XML 中的元素,但是当我尝试使用 ResourceServerConfigureAdapter#configure(HttpSecurity) 实现资源访问 block 时-- 完成@EnableResourceServer等等,那 configure方法甚至从不触发(端到端测试也失败)。下面的示例 Java 配置:

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
            resources.resourceId("oauth2/control");
        }

        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.antMatcher("/api/**")
                .authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                // before=PRE_AUTH_FILTER
                .addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
                .csrf().disable()
                .anonymous().disable()
                .exceptionHandling()
                .accessDeniedHandler(oAuth2AccessDeniedHandler)
                .authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
        }

我曾尝试声明几种不同的方式来影响配置,但没有成功。也就是说,我已经尝试了两个顶级 @Configuration类扩展 ResourceServerConfigurerAdapter和 bean 方法返回 ResourceServerConfigurationDave Syer's example ;我也试过将订单明确设置为 Ordered.HIGHEST_PRECEDENCE在适当的 bean 上。

很可能需要注意的是,大多数应用程序的遗留安全配置都是通过 XML 元素定义的,如上所示。关于我的配置的另一个可能的危险信号——为了让 token 端点根据基本身份验证 client_id:client_secret 进行身份验证,我必须自己连接 BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService)))))什么时候,因为它是验证 token 端点的 Vanilla 和“正确”方式,我希望 spring config 只是默认使用它。

无论如何,我在任何情况下都无法获得ResourceServerConfigureAdapter#configure(HttpSecurity)开火。我的理论是:

  • 关于前面的 XML HTTP block 的一些东西阻止了我 configure甚至被调用的方法

  • 这只是 Spring Boot 独有的功能——尽管我还没有看到任何具有这种效果的语言

  • 我在应用程序上下文中直接丢失了一些对象(同样,我在工作中使用的操作注释——除了明显的 @Configuration@Bean——是 @EnableWebSecurity@EnableAuthenticationServer@EnableResourceServer)。

  • 我犯了一些配置错误(呃)。

任何例子将不胜感激

下面的示例 OAuth2 配置类(几个不同的迭代之一):

@Configuration
@EnableWebSecurity
@EnableResourceServer
public class OAuth2Configuration {
    ... etc ...

    @Bean
    public ResourceServerConfiguration adminResources() {
        // copped from https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/multi
        ResourceServerConfiguration resource = new ResourceServerConfiguration() {
            public void setConfigurers(List<ResourceServerConfigurer> configurers) {
                super.setConfigurers(configurers);
            }
        };

        resource.setConfigurers(Collections.singletonList(new ResourceServerConfigurerAdapter() {

            @Override
            public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
                resources.resourceId("oauth2/control");
            }

            @Override
            public void configure(HttpSecurity http) throws Exception {
                http.antMatcher("/api/**")
                    .authorizeRequests().anyRequest().hasRole("OAUTH_USER").and()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                    // before=PRE_AUTH_FILTER
                    .addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class)
                    .csrf().disable()
                    .anonymous().disable()
                    .exceptionHandling()
                    .accessDeniedHandler(oAuth2AccessDeniedHandler)
                    .authenticationEntryPoint(loginUrlAuthenticationEntryPoint);
            }

        }));
        resource.setOrder(Ordered.HIGHEST_PRECEDENCE);

        return resource;
    }

    @Configuration
    @EnableAuthorizationServer
    public static class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
      ... etc ...
    }
}

类比<http> 提取的配置:

<sec:http pattern="/api/**" create-session="stateless"
          entry-point-ref="loginUrlAuthenticationEntryPoint">
    <sec:anonymous enabled="false" />
    <sec:csrf disabled="true"/> <!-- csrf tokens don't make sense for a 3rd party API -->
    <sec:custom-filter ref="oauth2ProcessingFilter" before="PRE_AUTH_FILTER"/>
    <sec:access-denied-handler ref="oauthAccessDeniedHandler" />
    <sec:intercept-url pattern="/api/**" access="hasRole('OAUTH_USER')" />
</sec:http>

最佳答案

如果您同时使用基于 Java 和基于 XML 的安全配置,则只会选择基于 XML 的。您是否尝试禁用/注释掉所有基于 XML 的 http 安全配置,看看您的基于 Java 的是否会激活?

我之前遇到过类似的问题。我在 Spring Security Gitter channel 寻求帮助,也做了一些调查。见下文:

enter image description here

关于java - Spring Security OAuth Java 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39472290/

相关文章:

java - 关于Java多线程使用notify()方法的两个问题

带有 spring 3.1 和 hibernate 4.01 的 HibernateInterceptor

java - Spring Boot错误响应中“message”字段为空

Spring Boot @JsonIgnore 在实体上,有时我希望一个属性作为 Json 返回

java - 使用 Spring Web MVC validator 类的服务器端验证

java - spring security 从数据库中获取用户 ID

java - Spring MVC : @Value annotation with final variable

java - 可以在 Android 中强制垃圾收集吗?

Java RegEx转义重复的单引号

java - GWT 中的 hibernate 错误