根据用户角色列出swiger中的api

时间:2017-07-04 11:01:34

标签: api swagger swagger-ui user-roles swashbuckle

我有一个要求,我希望根据用户角色列出swagger中的api方法。

例如: -

  • 具有基本访问权限的用户A可以使用有限的api方法。
  • 具有管理员权限的用户B可以使用所有列出的api方法。

我不知道如何实现这一点。

我正在使用Swashbuckle.AspNetCore Version="1.0.0"

2 个答案:

答案 0 :(得分:0)

尝试使用IDocumentFilter,您可以限制用户在SwaggerDocument中获取的内容以及来自该文件的swagger-ui源。

以下是一些示例https://github.com/heldersepu/SwashbuckleTest/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs#L261

答案 1 :(得分:0)

可能的解决方案:

  1. 在您的swagger配置中用不同的组名定义多个码头
@Bean
public Docket api1() {
    ...
    return new Docket(DocumentationType.SWAGGER_2)
            ...
            .groupName("api1")
            ...
            .paths(PathSelectors.ant("/api/api1Url/**"))
            .build().apiInfo(metaData());
}

@Bean
public Docket api2() {
    ...
    return new Docket(DocumentationType.SWAGGER_2)
            ...
            .groupName("api2")
            ...
            .paths(PathSelectors.ant("/api/api2Url/**"))
            .build().apiInfo(metaData());
}
  1. 定义您自己的DocumentationCache,它会覆盖Swagger的{
@Primary
@Component
public class RolesAwareDocumentationCache extends DocumentationCache {

    private final Map<String, Set<String>> allowedResourcesPerRole =
            Map.of(SecurityConfig.API1_ROLE, Collections.singleton("api1"),
                    SecurityConfig.API2_ROLE, Collections.singleton("api2"),
                    SecurityConfig.SOME_ADMIN_ROLE, Set.of("api1", "api2"));

    @Override
    public Map<String, Documentation> all() {
        var documentationMap = super.all();
        return documentationMap.entrySet().stream()
                .filter(e -> isAllowedForRole(e.getKey())) // check if has access to this group
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }

    private boolean isAllowedForRole(String groupName) {
        var userAuthorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream()
                .map(Object::toString)
                .collect(Collectors.toUnmodifiableSet());

        return userAuthorities.stream()
                .map(allowedResourcesPerRole::get) // get allowed resources for all of the user roles
                .filter(Objects::nonNull)
                .flatMap(Collection::stream) // flatMap to collection
                .anyMatch(s -> s.contains(groupName)); // check if result collection has specified group name
    }

}

因此,此缓存将根据安全上下文中当前用户的角色返回组。实际上,您可以使用任何规则来限制对不同组的访问。

也不要忘记为HttpSecurity定义适当的权限,以限制对不允许角色的API的调用。