使用CSE轻松实现接口访问控制

举报
liubao68 发表于 2019/04/16 11:58:45 2019/04/16
【摘要】 本文介绍了如何使用CSE轻松实现接口访问控制,通过例子展现了CSE微服务开发框架在契约管理方面的优势。

[基于CSE的微服务架构实践-基础架构](https://bbs.huaweicloud.com/blogs/8bb2c3b8366c11e9bd5a7ca23e93a891)中,我们介绍了一个典型的微服务架构,如下图。采用这种架构的微服务,通常会碰到一个问题:用户管理服务提供了大量的REST接口供其他微服务访问,但是不期望外部用户通过网关访问这些接口。

 

 

image.png

 

为了实现这个功能,很多开发框架要求用户在网关配置URL黑白名单,这个方法让用户实现接口访问控制变得复杂,并且容易疏漏。采用CSE可以轻松实现接口访问控制。

 

·         定义接口是否允许对外访问

在开发REST的接口的时候,需要声明这些接口是否允许对外访问。用户可以使用@Api或者@ApiOperation声明tags的方式,标记这些接口只能够对外访问。

 

@RestSchema(schemaId = "InternalAccessDemo")
@RequestMapping(path = "/")
@Api(tags = {"INTERNAL"})
public class InternalAccessDemo {
  @GetMapping(path = "localAccess")
  public String localAccess(String name) {
    return "Hello, " + name;
  }
}


 

·         网关实现Handler拦截请求

网关实现Hanlder,检查访问的接口是否具备定义的tags,如果具备,认为是内部接口,不允许访问。

 

public class InternalAccessHandler implements Handler {
 
  @Override
  public void handle(Invocation invocation, AsyncResponse asyncReponse) throws Exception {
    if (invocation.getOperationMeta().getSwaggerOperation().getTags() != null
        && invocation.getOperationMeta().getSwaggerOperation().getTags().contains("INTERNAL")) {
      asyncReponse.consumerFail(new InvocationException(403, "", "not allowed"));
      return;
    }
    invocation.next(asyncReponse);
  }
 
}


 

上面展示了Handler的逻辑:检查接口是否定义了名称为”INTERNAL”tags,如果包含,则不允许访问。通过定义cse.handler.xmlcse.handler.chain.Consumer.default启用这个自定义的Handler,就轻松的实现了接口访问控制。

 

 

上面的例子从一个简单的应用场景,展现了CSE相较于与其他开发框架(比如Spring Cloud等)的优势。CSE的运行时基于OpenAPI,可以在网关、客户端等处理环节获取到调用接口的元数据信息,这些信息为用户开发公共的管控能力,提供了强大的支持。CSE的治理能力,都是基于这些信息进行独立构建的。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。