当前位置: 首页 > 面试题库 >

带有Spring安全性的Swagger-ui

姜振濂
2023-03-14
问题内容

我有一个带有身份验证服务的简单REST应用程序。我尝试向其中添加swagger和swagger-ui,但只能在中看到端点/v2/api- docs。在其中,swagger-ui.html我仅看到端点组,但是无法扩展任何列表。

在chrome调试中,我看到:

加载资源失败:服务器响应状态为401()

未捕获的TypeError:无法读取未定义的属性’indexOf’

在带有服务器的终端上:

错误10020-[nio-5001-exec-3] ctrapJwtAuthenticationEntryPoint:响应未经授权的错误。消息-
访问此资源需要完全认证

似乎我的配置文件缺少某些内容,我尝试了一些在Web上找到的解决方案,但仍然无济于事。

这是我的代码:

绒球

<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>

控制者

@RestController
@PreAuthorize("hasRole('USER')")
@RequestMapping(path = "restaurant")
@Api(value="restaurant", description="Example operations for restaurants")
public class RestaurantController {
// endpoints
}

agger豆

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.tablebooker.restaurantservice.restaurant"))
                .paths(PathSelectors.any())
                .build();
    }
}

安全配置

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
        securedEnabled = true,
        jsr250Enabled = true,
        prePostEnabled = true
)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//other methods

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(unauthorizedHandler)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()
                .antMatchers("/api/auth/**")
                .permitAll()
                .antMatchers("/restaurant/**")
                .hasRole("USER")
                .anyRequest()
                .authenticated();

        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**");
    }
}

有什么想法可以使我的配置生效吗?


问题答案:

首先,您应该注册swagger的资源。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
    }
}

然后,因为您正在使用Spring Security,也许您应该关闭特权。

   @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().mvcMatchers(HttpMethod.OPTIONS, "/**");
        // ignore swagger 
        web.ignoring().mvcMatchers("/swagger-ui.html/**", "/configuration/**", "/swagger-resources/**", "/v2/api-docs");
    }

也许最好使用版本低于2.8.0的swagger,否则您可能不得不面对许多错误。



 类似资料:
  • 我试图在我的资源服务器上配置Swagger身份验证,以便我可以根据我的授权服务器进行身份验证。 我将资源服务器和授权服务器分开。它们都使用不同的端口在我的本地主机上启动。 端口8083上的资源服务器 每当我试图“授权”时,就会出现CORS问题。 我从另一个网站分叉了一个项目作为我的测试场地。下面是分叉项目。 https://github.com/cbriarnold/oauth2-spring-b

  • 我有一个节点。我想在其中添加炫耀文档的jsAPI。客户通过JWT授权,因此我将此添加到安全中: 然后我可以将它添加到不同的路径中,告诉客户端,要做到这一点,您需要登录。 但是,如何添加更具体的安全约束呢?例如,用户只有在以该用户身份登录时才能编辑配置文件。或者,如果用户具有超级管理员状态,或者如果他是论坛的管理员,则可以编辑评论,评论将发布在 OR 上,作为创建此评论的用户进行记录。

  • 当我使用security.basic.enabled=false在具有以下依赖项的Spring Boot项目上禁用安全性时: 为了修复此异常,我必须添加属性-management.security.enabled=false。我的理解是,当执行器在类路径中时,应该将security.basic.enabled=false和management.security.enabled=false设置为禁用

  • 我希望在Spring Boot项目(使用当前的V1.2.1版本)中使用Flyway作为数据库迁移处理的首选方式。 到目前为止,这工作得很好,但是使用JDBC数据源与Spring Security的集成似乎会覆盖Flyway机制。 下面是一个简单的场景: Spring Boot 1.2.1 PostgreSQL 9.4.1 根据Spring Security文档为用户、组和权限编写的Flyway迁移