我有一个要求,我希望根据用户角色列出swagger中的api方法。
例如: -
我不知道如何实现这一点。
我正在使用Swashbuckle.AspNetCore Version="1.0.0"
答案 0 :(得分:0)
尝试使用IDocumentFilter,您可以限制用户在SwaggerDocument中获取的内容以及来自该文件的swagger-ui源。
答案 1 :(得分:0)
可能的解决方案:
@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());
}
DocumentationCache
,它会覆盖Swagger的{1>
@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的调用。