Token

通常第三方系统调用linkis服务时,一般是通过token的方式进行认证

通过统一的认证处理filter:org.apache.linkis.server.security.SecurityFilter 来控制

实现的伪代码

  1. val TOKEN_KEY = "Token-Code"
  2. val TOKEN_USER_KEY = "Token-User"
  3. /* TokenAuthentication.isTokenRequest 通过判断请求request中:
  4. 1.请求头是否包含TOKEN_KEY和TOKEN_USER_KEY :getHeaders.containsKey(TOKEN_KEY) && getHeaders.containsKey(TOKEN_USER_KEY)
  5. 2.或则请求cookies中是否包含TOKEN_KEY和TOKEN_USER_KEY:getCookies.containsKey(TOKEN_KEY) &&getCookies.containsKey(TOKEN_USER_KEY)
  6. */
  7. if (TokenAuthentication.isTokenRequest(gatewayContext)) {
  8. /* 进行token认证
  9. 1. 确认是否开启token认证 配置项 `wds.linkis.gateway.conf.enable.token.auth`
  10. 2. 提取token tokenUser host信息进行认证,校验合法性
  11. */
  12. TokenAuthentication.tokenAuth(gatewayContext)
  13. } else {
  14. //普通的用户名密码认证
  15. }

可用的token以及对应可使用的ip相关信息数据存储在表linkis_mg_gateway_auth_token中, 详细见表解析说明,非实时更新, 会定期wds.linkis.token.cache.expire.hour(默认间隔12小时)刷新到服务内存中

管理台 基础数据管理> 令牌管理进行新增

  1. 名称:token名称 对应 Token-Code,如:TEST-AUTH
  2. 用户:该token对应的用户名,即感知到的请求用户,日志审计会使用到。如果不做限制可以配置为 *
  3. 主机:可访问的主机,会进行请求方的ip校验过滤。如果不做限制可以配置为 *
  4. 有效天数:如果永久有效,配置为-1

构建的http请求方式,需要在请求头中添加Token-Code,Token-User参数,

请求地址: http://127.0.0.1:9001/api/rest_j/v1/entrance/submit

body参数:

  1. {
  2. "executionContent": {"code": "sleep 5s;echo pwd", "runType": "shell"},
  3. "params": {"variable": {}, "configuration": {}},
  4. "source": {"scriptPath": "file:///mnt/bdp/hadoop/1.hql"},
  5. "labels": {
  6. "engineType": "shell-1",
  7. "userCreator": "hadoop-IDE",
  8. "executeOnce":"false "
  9. }
  10. }

请求头header:

  1. Content-Type:application/json
  2. Token-Code:BML-AUTH
  3. Token-User:hadoop

linkis 提供的客户端认证方式都支持Token策略模式new TokenAuthenticationStrategy()

详细可以参考SDK 方式

  1. // 1. build config: linkis gateway url
  2. DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder()
  3. .addServerUrl("http://127.0.0.1:9001/") //set linkis-mg-gateway url: http://{ip}:{port}
  4. .connectionTimeout(30000) //connectionTimeOut
  5. .discoveryEnabled(false) //disable discovery
  6. .discoveryFrequency(1, TimeUnit.MINUTES) // discovery frequency
  7. .loadbalancerEnabled(true) // enable loadbalance
  8. .maxConnectionSize(5) // set max Connection
  9. .retryEnabled(false) // set retry
  10. .readTimeout(30000) //set read timeout
  11. .setAuthenticationStrategy(new TokenAuthenticationStrategy()) // AuthenticationStrategy Linkis auth Token
  12. .setAuthTokenKey("Token-Code") // set token key
  13. .setAuthTokenValue("DSM-AUTH") // set token value
  14. .setDWSVersion("v1") //linkis rest version v1
  15. .build();

支持的token,对应的可用的用户/可使用请求方ip 是通过表linkis_mg_gateway_auth_token来控制,加载是非实时更新,使用了缓存机制

对于高危操作的限制,需要管理员角色的token才能操作,管理员token,格式为 admin-xxx