操作指南

API 文档

服务鉴权

最近更新时间:2020-07-01 17:20:39

准备工作

开始实践服务鉴权功能前,请确保已完成了 SDK 下载 ,并阅读 服务鉴权概述

这里演示如何快速实践服务鉴权功能。假如现在有两个微服务 provider 和 consumer,想实现 consumer 调用 provider 时,provider 对请求做鉴权。

依赖项

向工程中添加 spring-cloud-tsf-starter 依赖并开启 @EnableTsf 注解,详情请参考 快速入门 文档。

注意:

如果您使用的是 1.15.0-Edgware-RELEASE/1.15.0-Finchley-RELEASE 及之前的版本,使用方法参考 Spring Cloud SDK 历史版本使用方法

您需要在服务主调方和被调方都添加依赖项和注解的开启。此时您已经对服务开启了鉴权功能,任何到达服务的请求都会被鉴权,鉴权不通过时会返回 HTTP 403 Forbidden。

代码开发

如果请求双方想使用基本 tag 的鉴权规则,那么:

  • 对于 provider 而言,需要在控制台上设置 tag 鉴权规则。
  • 对于 consumer 而言,需要在业务代码中设置 tag 的内容。

控制台上配置鉴权规则,参考 服务鉴权基本操作

在 consumer 中设置 tag ,使用org.springframework.tsf.core包中的TsfContext类。设置 Tag 的方法签名如下:

/**
 * 设置多个 tag。如果有某个 tag 之前已经被设置过,那么它的值会被覆盖。
 */
public static void putTags(Map<String, String> tagMap, Tag.ControlFlag... flags) {}

/**
 * 设置单个 tag。如果该 key 之前已经被设置过,那么它的值会被覆盖。
 */
public static void putTag(String key, String value, Tag.ControlFlag... flags) {}

其中flags决定 tag 的使用场景,如果您没有特殊需要,不传即可:

public enum ControlFlag {
    TRANSITIVE,     // 表示标签要传递下去,默认不启用。
    NOT_IN_AUTH,    // 表示标签不被使用在服务鉴权,默认是被使用的。
    NOT_IN_ROUTE,   // 表示标签不被使用在服务路由,默认是被使用的。
    NOT_IN_SLEUTH   // 表示标签不被使用在调用链,默认是被使用的。
}

TSF 提供的 Demo consumer-demo/src/main/java/com/tsf/demo/consumer/Controller.java 中提供了一个设置 tag 的例子:

@RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET)
public String rest(@PathVariable String str, @RequestParam String user) {
    TsfContext.putTag("user", user); 
    return restTemplate.getForObject("http://provider-demo/echo/" + str, String.class);
}
目录