All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.gdface.facelog.client.dtalk.TokenRequestValidator Maven / Gradle / Ivy

The newest version!
package net.gdface.facelog.client.dtalk;

import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;

import com.alibaba.fastjson.TypeReference;
import com.gitee.l0km.com4j.base.BinaryUtils;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
import gu.dtalk.engine.RequestValidator;
import gu.simplemq.json.BaseJsonEncoder;
import net.gdface.facelog.Token;

import static com.google.common.base.Preconditions.*;

/**
 * 基于令牌的连接请求验证接口实现
* 通过连接请求中提供的令牌验证是否为管理身份(root,管理员,操作员),是则准予连接,否则抛出异常 * * @author guyadong * */ public class TokenRequestValidator implements RequestValidator { /** * dtalk请求字段定义 * @author guyadong * */ public enum DtalkReqField{ /** 令牌,类型: {@link net.gdface.facelog.Token} */TOKEN, /** 当前MAC地址,类型: {@link String} 12 HEX characters */MAC } private final Function ranker; /** * @param ranker 用于返回令牌的管理等级 *
  • 4---root
  • *
  • 3---管理员
  • *
  • 2---操作员
  • *
  • 0---普通用户
  • *
  • -1---未定义
  • */ public TokenRequestValidator(Function ranker) { this.ranker = checkNotNull(ranker,"ranker is null"); } /** * 通过令牌验证连接请求合法性 * @see gu.dtalk.engine.RequestValidator#validate(java.lang.String, AtomicReference) */ @Override public void validate(String connstr, AtomicReference clientID) throws Exception { Map m = decodeReq(connstr); if(clientID != null){ clientID.set((String)m.get(DtalkReqField.MAC)); } Token token = (Token)m.get(DtalkReqField.TOKEN); Integer rank = ranker.apply(token); checkState(rank >1 && rank <5,"ADMIN TOKEN REQUIRED(rank = 2,3,4)"); } /** * 将{@code Token}实例和MAC地址({@link String})解析为连接请求字符串(json) * @param token * @param reqmac */ public static String encodeReq(Token token,byte[] reqmac){ checkArgument(reqmac != null && reqmac.length == 6,"INVALID mac address"); ImmutableMap m = ImmutableMap.of( DtalkReqField.TOKEN.name(),checkNotNull(token,"token is null"), DtalkReqField.MAC.name(),BinaryUtils.toHex(reqmac)); return BaseJsonEncoder.getEncoder().toJsonString(m); } /** * 将连接请求字符串(json)解析为{@code Token}实例和MAC地址({@link String}) * @param connstr */ private static Map decodeReq(String connstr){ checkArgument(connstr != null,"connstr is null"); Map m = BaseJsonEncoder.getEncoder().fromJson(connstr, new TypeReference>(){}.getType()); // 分字段解析 Token token = BaseJsonEncoder.getEncoder().fromJson(m.get(DtalkReqField.TOKEN),Token.class); String mac = m.get(DtalkReqField.MAC); return ImmutableMap.of( DtalkReqField.TOKEN,checkNotNull(token,"request token must REQUIRED"), DtalkReqField.MAC,checkNotNull(mac,"MAC address must REQUIRED")); } }




    © 2015 - 2025 Weber Informatics LLC | Privacy Policy