Spring:一起使用Oauth2和HttpBasicAuth

时间:2018-04-05 11:51:54

标签: spring spring-boot swagger springfox

我使用的是Spring Boot 2.0.0

为了保护我的REST API,我使用Oauth2和JWT,这非常合适。

问题是:

我也使用Springfox Swagger,它应该由BasicAuth保护。因此,如果用户将浏览器指向 /swagger-ui.html ,则会受到质疑 因此我有两个配置文件:

SecurityConfig

@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {

    @Throws(Exception::class)
    override fun configure(web: WebSecurity) {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**")
    }

    @Throws(Exception::class)
    override fun configure(auth: AuthenticationManagerBuilder) {
        auth.inMemoryAuthentication()
                //user: "user", password: "Passw0rd!"
                .withUser("user")
                .password("\$2a\$04\$DDYoNw1VAYt64.zU.NsUpOdvjZ3OVrGXJAyARkraaS00h322eL2iy")
                .roles("ADMIN")
    }
}

ResourceServerConfig

@Configuration
@EnableResourceServer
class ResourceServerConfig : ResourceServerConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        super.configure(http)
        http.httpBasic().and().cors().and().csrf().disable()
                .authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .antMatcher("/swagger-ui.html**")
                .authorizeRequests().anyRequest().hasRole("ADMIN")

    }
}

我认为此处不需要 OAuth2AuthorizationServerConfig

显示的配置(当然)不起作用,所以问题是: 是否可以混合BasicAuth和Oauth2?

2 个答案:

答案 0 :(得分:1)

好的,我或多或少找到了我的问题的答案:

<强> SecurityConfig

@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {

    @Throws(Exception::class)
    override fun configure(auth: AuthenticationManagerBuilder) {
        auth.inMemoryAuthentication()
                //user: "user", password: "Passw0rd!"
                .withUser("user")
                .password("...")
                .roles("ADMIN")
    }

    override fun configure(http: HttpSecurity) {
        http.csrf()
                .and()
                .httpBasic()
                .and()
                .authorizeRequests()
                .antMatchers(
                        "/swagger-ui.html**").hasRole("ADMIN")
                .antMatchers(
                        "/v2/api-docs",
                        "/swagger-resources/**",
                        "/configuration/security", "/webjars/**"
                ).permitAll()
    }
}

<强> ResourceServerConfig

@Configuration
@EnableResourceServer
class ResourceServerConfig : ResourceServerConfigurerAdapter() {

    override fun configure(http: HttpSecurity) {
        http.cors().and()
                .antMatcher("/api")
                .authorizeRequests().antMatchers("/api/**").authenticated()
    }
}

我在 ResourceServerConfig 中使用 antMatcher 来仅使用oauth2保护/ api / **路径。

BasicAuth部分发生在 SecurityConfig 中。 当前解决方案仅将BasicAuth仅应用于 /swagger-ui.html 端点。其他招摇的资源是公开可见的。

有没有人知道如何保护 / v2 / api-docs

答案 1 :(得分:0)

这都是关于将安全性配置匹配到不同的应用程序上下文路径。在Run a Spring Boot oAuth2 application as resource server AND serving web content上查看我的答案-希望对您有所帮助。