最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

rocketmq的AclClientRPCHook權(quán)限控制使用技巧示例詳解

 更新時間:2023年08月06日 10:15:59   作者:codecraft  
這篇文章主要為大家介紹了rocketmq的AclClientRPCHook使用技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下rocketmq的AclClientRPCHook

RPCHook

rocketmq-remoting-4.5.2-sources.jar!/org/apache/rocketmq/remoting/RPCHook.java

public interface RPCHook {
    void doBeforeRequest(final String remoteAddr, final RemotingCommand request);
    void doAfterResponse(final String remoteAddr, final RemotingCommand request,
        final RemotingCommand response);
}
  • RPCHook定義了doBeforeRequest、doAfterResponse方法

AclClientRPCHook

rocketmq-acl-4.5.2-sources.jar!/org/apache/rocketmq/acl/common/AclClientRPCHook.java

public class AclClientRPCHook implements RPCHook {
    private final SessionCredentials sessionCredentials;
    protected ConcurrentHashMap<Class<? extends CommandCustomHeader>, Field[]> fieldCache =
        new ConcurrentHashMap<Class<? extends CommandCustomHeader>, Field[]>();
    public AclClientRPCHook(SessionCredentials sessionCredentials) {
        this.sessionCredentials = sessionCredentials;
    }
    @Override
    public void doBeforeRequest(String remoteAddr, RemotingCommand request) {
        byte[] total = AclUtils.combineRequestContent(request,
            parseRequestContent(request, sessionCredentials.getAccessKey(), sessionCredentials.getSecurityToken()));
        String signature = AclUtils.calSignature(total, sessionCredentials.getSecretKey());
        request.addExtField(SIGNATURE, signature);
        request.addExtField(ACCESS_KEY, sessionCredentials.getAccessKey());
        // The SecurityToken value is unneccessary,user can choose this one.
        if (sessionCredentials.getSecurityToken() != null) {
            request.addExtField(SECURITY_TOKEN, sessionCredentials.getSecurityToken());
        }
    }
    @Override
    public void doAfterResponse(String remoteAddr, RemotingCommand request, RemotingCommand response) {
    }
    protected SortedMap<String, String> parseRequestContent(RemotingCommand request, String ak, String securityToken) {
        CommandCustomHeader header = request.readCustomHeader();
        // Sort property
        SortedMap<String, String> map = new TreeMap<String, String>();
        map.put(ACCESS_KEY, ak);
        if (securityToken != null) {
            map.put(SECURITY_TOKEN, securityToken);
        }
        try {
            // Add header properties
            if (null != header) {
                Field[] fields = fieldCache.get(header.getClass());
                if (null == fields) {
                    fields = header.getClass().getDeclaredFields();
                    for (Field field : fields) {
                        field.setAccessible(true);
                    }
                    Field[] tmp = fieldCache.putIfAbsent(header.getClass(), fields);
                    if (null != tmp) {
                        fields = tmp;
                    }
                }
                for (Field field : fields) {
                    Object value = field.get(header);
                    if (null != value && !field.isSynthetic()) {
                        map.put(field.getName(), value.toString());
                    }
                }
            }
            return map;
        } catch (Exception e) {
            throw new RuntimeException("incompatible exception.", e);
        }
    }
    public SessionCredentials getSessionCredentials() {
        return sessionCredentials;
    }
}
  • AclClientRPCHook實現(xiàn)了RPCHook接口,其構(gòu)造器接收SessionCredentials參數(shù);其doBeforeRequest首先通過parseRequestContent從request讀取CommandCustomHeader,將其field連同accessKey、securityToken放到一個SortedMap,再通過AclUtils.combineRequestContent計算要發(fā)送的請求內(nèi)容;然后通過AclUtils.calSignature計算出signature,最后往request的extFields添加SIGNATURE、ACCESS_KEY;若設(shè)置securityToken,則會往request的extFields添加SECURITY_TOKEN

SessionCredentials

rocketmq-acl-4.5.2-sources.jar!/org/apache/rocketmq/acl/common/SessionCredentials.java

public class SessionCredentials {
    public static final Charset CHARSET = Charset.forName("UTF-8");
    public static final String ACCESS_KEY = "AccessKey";
    public static final String SECRET_KEY = "SecretKey";
    public static final String SIGNATURE = "Signature";
    public static final String SECURITY_TOKEN = "SecurityToken";
    public static final String KEY_FILE = System.getProperty("rocketmq.client.keyFile",
        System.getProperty("user.home") + File.separator + "key");
    private String accessKey;
    private String secretKey;
    private String securityToken;
    private String signature;
    public SessionCredentials() {
        String keyContent = null;
        try {
            keyContent = MixAll.file2String(KEY_FILE);
        } catch (IOException ignore) {
        }
        if (keyContent != null) {
            Properties prop = MixAll.string2Properties(keyContent);
            if (prop != null) {
                this.updateContent(prop);
            }
        }
    }
    public SessionCredentials(String accessKey, String secretKey) {
        this.accessKey = accessKey;
        this.secretKey = secretKey;
    }
    public SessionCredentials(String accessKey, String secretKey, String securityToken) {
        this(accessKey, secretKey);
        this.securityToken = securityToken;
    }
    public void updateContent(Properties prop) {
        {
            String value = prop.getProperty(ACCESS_KEY);
            if (value != null) {
                this.accessKey = value.trim();
            }
        }
        {
            String value = prop.getProperty(SECRET_KEY);
            if (value != null) {
                this.secretKey = value.trim();
            }
        }
        {
            String value = prop.getProperty(SECURITY_TOKEN);
            if (value != null) {
                this.securityToken = value.trim();
            }
        }
    }
    //......
}
  • SessionCredentials提供了三個構(gòu)造器,一個無參構(gòu)造器從KEY_FILE加載keyContent然后解析為Properties再通過updateContent方法給accessKey、secretKey、securityToken賦值;一個是accessKey, secretKey的構(gòu)造器;還有一個是accessKey, secretKey, securityToken的構(gòu)造器

AclUtils

rocketmq-acl-4.5.2-sources.jar!/org/apache/rocketmq/acl/common/AclUtils.java

public class AclUtils {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME);
    public static byte[] combineRequestContent(RemotingCommand request, SortedMap<String, String> fieldsMap) {
        try {
            StringBuilder sb = new StringBuilder("");
            for (Map.Entry<String, String> entry : fieldsMap.entrySet()) {
                if (!SessionCredentials.SIGNATURE.equals(entry.getKey())) {
                    sb.append(entry.getValue());
                }
            }
            return AclUtils.combineBytes(sb.toString().getBytes(CHARSET), request.getBody());
        } catch (Exception e) {
            throw new RuntimeException("Incompatible exception.", e);
        }
    }
    public static byte[] combineBytes(byte[] b1, byte[] b2) {
        int size = (null != b1 ? b1.length : 0) + (null != b2 ? b2.length : 0);
        byte[] total = new byte[size];
        if (null != b1)
            System.arraycopy(b1, 0, total, 0, b1.length);
        if (null != b2)
            System.arraycopy(b2, 0, total, b1.length, b2.length);
        return total;
    }
    public static String calSignature(byte[] data, String secretKey) {
        String signature = AclSigner.calSignature(data, secretKey);
        return signature;
    }
    //......
}
  • combineRequestContent首先將fieldsMap拼接為字符串,然后通過AclUtils.combineBytes將其與request.getBody()結(jié)合在一起;calSignature方法內(nèi)部是委托給AclSigner.calSignature(data, secretKey)來實現(xiàn)

AclSigner

rocketmq-acl-4.5.2-sources.jar!/org/apache/rocketmq/acl/common/AclSigner.java

public class AclSigner {
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    public static final SigningAlgorithm DEFAULT_ALGORITHM = SigningAlgorithm.HmacSHA1;
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.ROCKETMQ_AUTHORIZE_LOGGER_NAME);
    private static final int CAL_SIGNATURE_FAILED = 10015;
    private static final String CAL_SIGNATURE_FAILED_MSG = "[%s:signature-failed] unable to calculate a request signature. error=%s";
    public static String calSignature(String data, String key) throws AclException {
        return calSignature(data, key, DEFAULT_ALGORITHM, DEFAULT_CHARSET);
    }
    public static String calSignature(String data, String key, SigningAlgorithm algorithm,
        Charset charset) throws AclException {
        return signAndBase64Encode(data, key, algorithm, charset);
    }
    private static String signAndBase64Encode(String data, String key, SigningAlgorithm algorithm, Charset charset)
        throws AclException {
        try {
            byte[] signature = sign(data.getBytes(charset), key.getBytes(charset), algorithm);
            return new String(Base64.encodeBase64(signature), DEFAULT_CHARSET);
        } catch (Exception e) {
            String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage());
            log.error(message, e);
            throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e);
        }
    }
    private static byte[] sign(byte[] data, byte[] key, SigningAlgorithm algorithm) throws AclException {
        try {
            Mac mac = Mac.getInstance(algorithm.toString());
            mac.init(new SecretKeySpec(key, algorithm.toString()));
            return mac.doFinal(data);
        } catch (Exception e) {
            String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage());
            log.error(message, e);
            throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e);
        }
    }
    public static String calSignature(byte[] data, String key) throws AclException {
        return calSignature(data, key, DEFAULT_ALGORITHM, DEFAULT_CHARSET);
    }
    public static String calSignature(byte[] data, String key, SigningAlgorithm algorithm,
        Charset charset) throws AclException {
        return signAndBase64Encode(data, key, algorithm, charset);
    }
    private static String signAndBase64Encode(byte[] data, String key, SigningAlgorithm algorithm, Charset charset)
        throws AclException {
        try {
            byte[] signature = sign(data, key.getBytes(charset), algorithm);
            return new String(Base64.encodeBase64(signature), DEFAULT_CHARSET);
        } catch (Exception e) {
            String message = String.format(CAL_SIGNATURE_FAILED_MSG, CAL_SIGNATURE_FAILED, e.getMessage());
            log.error(message, e);
            throw new AclException("CAL_SIGNATURE_FAILED", CAL_SIGNATURE_FAILED, message, e);
        }
    }
}
  • calSignature默認使用的是SigningAlgorithm.HmacSHA1及Charset.forName("UTF-8")字符集來簽名;signAndBase64Encode方法首先通過sign方法簽名,然后將其轉(zhuǎn)為Base64的字符串

小結(jié)

AclClientRPCHook實現(xiàn)了RPCHook接口,其構(gòu)造器接收SessionCredentials參數(shù);其doBeforeRequest首先通過parseRequestContent從request讀取CommandCustomHeader,將其field連同accessKey、securityToken放到一個SortedMap,再通過AclUtils.combineRequestContent計算要發(fā)送的請求內(nèi)容;然后通過AclUtils.calSignature計算出signature,最后往request的extFields添加SIGNATURE、ACCESS_KEY;若設(shè)置securityToken,則會往request的extFields添加SECURITY_TOKEN

doc AclClientRPCHook

以上就是rocketmq的AclClientRPCHook使用技巧示例詳解的詳細內(nèi)容,更多關(guān)于rocketmq AclClientRPCHook的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中零拷貝和深拷貝的原理及實現(xiàn)探究(代碼示例)

    Java中零拷貝和深拷貝的原理及實現(xiàn)探究(代碼示例)

    深拷貝和零拷貝是兩個在 Java 中廣泛使用的概念,它們分別用于對象復(fù)制和數(shù)據(jù)傳輸優(yōu)化,下面將詳細介紹這兩個概念的原理,并給出相應(yīng)的 Java 代碼示例,感興趣的朋友一起看看吧
    2023-12-12
  • JAVA實現(xiàn)賬戶取款和存款操作

    JAVA實現(xiàn)賬戶取款和存款操作

    這篇文章主要介紹了JAVA實現(xiàn)賬戶取款和存款操作,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • IntelliJ IDEA 中高效使用 Git 的實用指南

    IntelliJ IDEA 中高效使用 Git 的實用指南

    本文主要介紹了在IntelliJ IDEA中高效使用Git的實用指南,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • 如何使用java判斷是不是數(shù)字

    如何使用java判斷是不是數(shù)字

    這篇文章主要給大家介紹了關(guān)于如何使用java判斷是不是數(shù)字的相關(guān)資料,判斷一個字符串是否為數(shù)字是Java開發(fā)中很常見的業(yè)務(wù)需求,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Java兩種方法計算出階乘尾部連續(xù)0的個數(shù)

    Java兩種方法計算出階乘尾部連續(xù)0的個數(shù)

    這篇文章主要介紹了Java兩種方法計算出階乘尾部連續(xù)0的個數(shù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot 如何使用 JWT 保護 Rest Api 接口

    SpringBoot 如何使用 JWT 保護 Rest Api&nbs

    使用spring-boot開發(fā)RESTful API非常的方便,在生產(chǎn)環(huán)境中,對發(fā)布的 API 增加授權(quán)保護是非常必要的,現(xiàn)在我們來看如何利用JWT技術(shù)為API 增加授權(quán)保護,保證只有獲得授權(quán)的用戶才能夠訪問 API,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • Springboot集成Kafka進行批量消費及踩坑點

    Springboot集成Kafka進行批量消費及踩坑點

    本文主要介紹了Springboot集成Kafka進行批量消費及踩坑點,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 學(xué)習(xí)Java中Class類及其用法

    學(xué)習(xí)Java中Class類及其用法

    這篇文章分為三大部分,主要內(nèi)容有Class類原理詳解、用法及泛化,需要的朋友可以參考下
    2015-07-07
  • 淺談Java編程中string的理解與運用

    淺談Java編程中string的理解與運用

    這篇文章主要介紹了淺談Java編程中string的理解與運用,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • 淺談springcloud常用依賴和配置

    淺談springcloud常用依賴和配置

    鑒于很多小伙伴常問spring cloud常用依賴和配置,今天特地整理了本篇文章,文中有非常詳細的代碼示例,對正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05

最新評論

鄄城县| 周至县| 广水市| 临洮县| 松潘县| 水富县| 府谷县| 定州市| 临西县| 泽库县| 鹿泉市| 高淳县| 承德县| 浦城县| 阿拉善右旗| 涡阳县| 辽阳市| 延安市| 道孚县| 涟水县| 体育| 和顺县| 兰坪| 景宁| 偃师市| 建平县| 普兰县| 五河县| 弥渡县| 梁山县| 鄢陵县| 彭阳县| 通山县| 华蓥市| 佛山市| 黔西县| 宽甸| 辽阳县| 静安区| 连城县| 孙吴县|