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

将Swagger UI限制为特定角色

祁星阑
2023-03-14

我试图将对Swagger用户界面(UI)的访问限制为特定角色(例如,Swagger API用户、系统管理员用户等)

我在这个SO问题中尝试了答案--限制对Swagger UI的访问

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * XLogger.
     */
    private static final XLogger LOG = XLoggerFactory.getXLogger(WebSecurityConfig.class);

    @Value("${my.property.allowedOrigins}")
    private String[] corsAllowedOrigins;

    @Value("${my.property.excludeUrlPattern}")
    private String[] excludeUrlPattern;

    @Autowired
    ApplicationContext applicationContext;

    /**
     * The AuthenticationSuccessHandler.
     */
    @Autowired
    HSSAuthenticationSuccessHandler authenticationSuccessHandler;

    /**
     * The runtime properties
     */
    @Autowired
    RuntimeProperties runtimeProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        LOG.entry(http);

        String[] noAuthPermitAllPatterns = runtimeProperties.getApplicationProperties().getNoAuthPermitAllPatterns();

        http.authorizeRequests()
                .antMatchers("/swagger-ui/**", "/**/swagger-ui/**", "/v3/api-docs/**", "/**/v3/api-docs/**")
                .hasRole("ADMIN").antMatchers(noAuthPermitAllPatterns).permitAll().anyRequest().authenticated().and()
                .formLogin().failureHandler(authenticationFailureHandler()).successHandler(authenticationSuccessHandler)
                .loginPage("/saml/login").permitAll().and().logout().logoutSuccessUrl("/logoutSuccess").permitAll()
                .invalidateHttpSession(true).and().csrf().disable().cors()
                .configurationSource(corsConfigurationSource());
        http.addFilterBefore((MetadataGeneratorFilter) applicationContext.getBean("metadataGeneratorFilter"),
                ChannelProcessingFilter.class).addFilterAfter(
                        (FilterChainProxy) applicationContext.getBean("samlFilter"), BasicAuthenticationFilter.class);

        LOG.exit();
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        LOG.entry();

        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList(corsAllowedOrigins));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT"));
        configuration.setAllowCredentials(true);
        // the below three lines will add the relevant CORS response headers
        configuration.addAllowedOrigin("*");
        configuration.addAllowedHeader("*");
        configuration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return LOG.exit(source);
    }

    @Override
    @Bean(name = "webAuthenticationManagerBean")
    public AuthenticationManager authenticationManagerBean() throws Exception {
        LOG.entry();
        return LOG.exit(super.authenticationManagerBean());
    }

    /**
     * Authentication Failure Handler
     *
     * @return The Authentication Failure Handler
     */
    @Bean(name = "authenticationFailureHandler")
    protected AuthenticationFailureHandler authenticationFailureHandler() {
        LOG.entry();

        String defaultFailureUrl = runtimeProperties.getApplicationProperties().getDefaultFailureURL();
        ExceptionMappingAuthenticationFailureHandler authFailureHandler = new ExceptionMappingAuthenticationFailureHandler();
        authFailureHandler.setDefaultFailureUrl(defaultFailureUrl);
        Map<String, String> mappings = new HashMap<>();
        mappings.put("org.springframework.security.authentication.InternalAuthenticationServiceException",
                defaultFailureUrl);
        mappings.put("org.springframework.security.saml.SAMLAuthenticationToken", defaultFailureUrl);
        mappings.put("org.springframework.security.authentication.AuthenticationServiceException", defaultFailureUrl);
        authFailureHandler.setExceptionMappings(mappings);

        return LOG.exit(authFailureHandler);
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        LOG.entry(web);
        web.ignoring().antMatchers(excludeUrlPattern);
        LOG.exit();
    }
}

我想我在等401的未经授权的回复。我对昂首阔步是完全陌生的,所以任何建议都很感激!

共有1个答案

宋安晏
2023-03-14

与其他endpoint相同。这仍然允许其他人下载swagger配置,如果您真的需要控制级别,您也可以阻止/api-docs/**

...
  .antMatchers("/swagger-ui/**") // For URI starting with swagger-ui
  .hasRole("USER")
  .antMatchers("/**/swagger-ui/**") // For URI that contains swagger-ui
  .hasRole("USER")
...
 类似资料:
  • 我正在尝试限制kubernetes仪表板上的a用户,该仪表板在我创建后连接到kubectl。他和相应的配置的crt。 我成功地限制了他可以使用以下role.yaml 和簇绑定 让他能够进入仪表板。问题是,我只希望他能够访问名称空间。 我已经搜索了一些,一些解决方案似乎涉及创建一个服务帐户,另一个问题可能是因为查看仪表板的权限是在集群角色上授予的,并且无法命名。 有没有最好的方法来解决这个问题?

  • 我有3个用户角色:管理员、客户和员工。 登录后,每个角色将重定向到特定的仪表板,例如:-管理员:网站。com/admin-客户:网站。com/客户-员工:网站。通讯员/雇员 此时,无论我使用哪个用户角色,都可以通过这些网址访问所有内容。 限制客户打开admin的最简单方法是什么 Laravel版本5.2.45 PHP版本7.2我正在使用共享托管提供商。谢谢你们

  • 问题内容: 如何将MySQL数据库中的user_account限制为特定表。例如: 我只想将“ RestrictedUser”限制为,并且将创建该表的其余表以供将来使用,并授予其访问权限。 问题答案: 假设用户没有当前权限,则可以执行以下操作 根据您希望授予用户的特权,您可以更改为其他内容,例如。 之后,请记住清除特权以使其生效。

  • 下面是我使用的一些代码: 如何只打印信息日志?

  • 问题内容: 我正在创建一个移动模拟器,该模拟器使用100%javascript,HTML5和CSS在Web浏览器中模拟iPhone(以及以后的其他设备)的外观和功能,并且该模拟器仅使用客户端代码即可完全起作用。 在尝试通过对原始应用程序项目本身进行少量修改而完成此任务的同时,将其托管在模拟器中,我将and 标记注入页面的顶部,然后将html加载到屏幕中。 问题是,当我加载一个新的CSS文件时,(显

  • 我如何使我网络中的服务器和客户端不仅验证信任链,而且尊重某种白名单? 也许这在TLS层上是不可行的,这就是我想澄清的。