当前位置: 首页 > 知识库问答 >
问题:

将 Swagger 基本身份验证添加到Spring启动应用程序

仲孙鸿畴
2023-03-14

要求:

  • Spring启动应用程序与Spring狐狸
  • 将基本身份验证添加到 Swagger
  • 传递所有其他请求

代码:已实现

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
                .hasAuthority("SWAGGER")
                .anyRequest().permitAll()
            .and()
                .httpBasic()
            .and()
                .csrf().disable();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("SWAGGER");
    }
}

然而,这段代码无法工作-您可以自由浏览/炫耀ui。html#/没有任何授权。

问题是-为什么BASIC身份验证和用户不适用于swagger uiendpoint?

共有3个答案

万俟招
2023-03-14

您的配置很奇怪。你可以尝试这样的事情:

public static void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
    .antMatcher("/swagger-ui.html")
    .authorizeRequests()
        .anyRequest().hasAnyRole("SWAGGER")
        .and()
    .httpBasic();
}

这确保了对swagger ui的授权。htmlpath(具有SWAGGER角色)。

牟子真
2023-03-14

你可以做如下事情

昂首阔步的代码如下。

    private List<SecurityScheme> basicScheme() {
        List<SecurityScheme> schemeList = new ArrayList<>();
        schemeList.add(new BasicAuth("basicAuth"));
        return schemeList;
    }

    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
            .
            .
            .
            .securitySchemes(basicScheme());
    }

用于安全配置

    public void configureGlobal(final AuthenticationManagerBuilder auth)
        throws Exception {
        auth.inMemoryAuthentication()
                .withUser("USER")
                .password("PASSWORD")
                .roles("ADMIN");
    }
    .
    .
    .
    @Override
    protected void configure(final HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable().authorizeRequests()
    .anyRequest().authenticated().and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().httpBasic();
    }
    .
    .
    .
    @Override
    public void configure(final WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs",
            "/configuration/ui",
            "/swagger-resources/**",
            "/webjars/**",
            "/configuration/security",
            "/swagger-ui.html");
    }

下面使用 swagger 将授权传递给方法。

   @PutMapping("/registration/{id}")
    @ApiOperation(value = "Update registration detail",
                  authorizations = { @Authorization(value="basicAuth") })
    public ResponseEntity<RegistrationModel> updateRegistration(

在你的pom.xml,你将需要:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

基本上就是这样。

郜彦
2023-03-14

您应该使用. Authated()而不是. permitAll()

.authorizeRequests()
    .antMatchers("/swagger-resources/*", "*.html", "/api/v1/swagger.json")
        .hasRole("SWAGGER")
    .anyRequest()
        .authenticated()

这将:

> < li>

限制对匹配< code >/swagger-resources/* ,< code>*的所有资源的访问。html和< code >/API/v1/swagger . JSON

允许对所有其他资源进行未经身份验证的访问

为了澄清为什么您的配置不起作用,这是因为您没有像应该阅读的那样阅读Spring-Security。

您的旧配置如下所示:

.authorizeRequests() // allow requests
    .antMatchers(...) // that matches this
        .hasAuthority("SWAGGER") // with SWAGGER authority
    .anyRequest() // All requests above
        .permitAll() // grant full access 

换句话说,您正在向具有 SWAGGER 权限的用户授予完全访问权限,但您忽略了的是,默认情况下,他们已经有权访问它。更准确地说,除非您另有说明,否则每个人都可以访问它。

通过使用 .身份验证 ()。你告诉Spring,你希望所有匹配的请求都仅限于具有适当角色权限的人。

新配置:

.authorizeRequests() // allow requests
    .antMatchers(...) // that matches this
        .hasRole("SWAGGER") // with role SWAGGER
    .anyRequest() // all requests above
        .authenticated() // needs authentication

关于您的/swagger resources/swaggers resources/configuration/securityreturning 401问题:

您应该将/swagger resources/*替换为/swaggerresources/**

在配置末尾添加以下内容,以允许所有不匹配的请求:

.authorizeRequests()
    .anyRequest()
        .permitAll();

 类似资料:
  • 我正在将Monolith Java/Spring服务器重写为MicroService,同时向客户机公开相同的API接口,这样他们就不会注意到任何更改。 在Monolith服务器中,我们使用和。 第一部分是创建一个基于Java的API-Gateway,它将处理所有身份验证/授权作为通往Monolith服务器的隧道。 创建新的微服务(使用spring Initializer)后,我尝试将spring

  • .Net Framework 4.6.1,类库项目(Web API) 我已经将swagger/swashbuckle nuget添加到项目中,并将SwaggerConfig.cs文件添加到我的App_Start文件夹中。 SwaggerConfig.cs的剪报 然后我继续注册服务 但是我不确定在哪里设置了查看文档所需的用户名/密码。API方法都使用令牌进行认证,但是我试图添加一个安全层,通过使用基

  • 我已经集成了Swagger,以便使用SpringBoot为SpringREST应用程序生成API文档。它工作得很好,当我点击URL时,我可以看到生成的API文档:http://localhost:8080/test/swagger-用户界面。html我的问题是如何限制对API的访问?基于硬编码用户名和密码的基本身份验证应该足够好,至少从一开始就足够了。我使用maven添加了“swagger2”依赖

  • 我正在尝试使用OAuth2实现开发一个带有Spring Security性的rest api。但是如何删除基本身份验证呢。我只想向body发送用户名和密码,并在postman上获取令牌。 要删除基本身份验证,并从邮递员的get token中发送body标记中的用户名密码吗 我遇到了一些问题{"错误":"未经授权","error_description":"没有客户端身份验证。尝试添加适当的身份验证

  • 但我对spring-boot/java还是个新手...有谁能帮我把这条路走对吗? 多谢了。

  • 我想使用基本身份验证调用keydrope Rest API。为了做到这一点,我尝试了下面的答案,但缺少链接。 我已将客户端访问类型设置为机密,并启用了直接访问授权。 显然,需要在Java适配器配置中指定启用基本身份验证,但我看不出这是如何实现的。文档中提到它是一个JSON文件,听起来像是我将其作为配置添加到Keyclope目录中。 最后,我看到有人提到使用生成的秘密。我可以在选项卡中生成一个秘密,