
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
© 2015 - 2025 Weber Informatics LLC | Privacy Policy