自定义校验token(2.5.0)

从2.5.0开始在@ApiMapping注解中新增了一个属性needToken,用来告诉网关是否校验token

  1. /**
  2. * 是否需要appAuthToken,设置为true,网关端会校验token是否存在
  3. */
  4. boolean needToken() default false;

使用方式:

  1. @ApiMapping(value = "story.token.get", needToken = true/* 设置true,网关会校验token是否存在 */)
  2. public StoryResult token(StoryParam story) {
  3. OpenContext openContext = ServiceContext.getCurrentContext().getOpenContext();
  4. String appAuthToken = openContext.getAppAuthToken();
  5. StoryResult result = new StoryResult();
  6. result.setName("appAuthToken:" + appAuthToken);
  7. return result;
  8. }

指定了needToken=true后,网关会判断客户端是否传了app_auth_token参数,没有传则返回错误信息。

网关默认简单校验参数值是否存在,如果要校验有效性,需要自己实现。

自己实现步骤:

  • 在ZuulConfig类中重写doAfter方法
  • 设置ApiConfig中的tokenValidator属性

TokenValidator是一个函数式接口,可以直接使用Lambda表达式,示例代码如下:

  1. public class ZuulConfig extends AlipayZuulConfiguration {
  2. @Override
  3. protected void doAfter() {
  4. ApiConfig.getInstance().setTokenValidator(apiParam -> {
  5. // 获取客户端传递过来的token
  6. String token = apiParam.fetchAccessToken();
  7. if (StringUtils.isBlank(token)) {
  8. return false;
  9. }
  10. // TODO: 校验token有效性,可以从redis中读取
  11. // 返回true表示这个token真实、有效
  12. return true;
  13. });
  14. }
  15. }