• dubbo源码阅读-Filter默认实现(十一)之TokenFilter


    文档

    http://dubbo.apache.org/zh-cn/docs/user/demos/token-authorization.html

    随机生成token

    详情见:https://www.cnblogs.com/LQBlog/p/12469007.html#autoid-6-11-0

     //是否有token配置 将token配置到map
            if (!ConfigUtils.isEmpty(token)) {
                if (ConfigUtils.isDefault(token)) {
                    map.put(Constants.TOKEN_KEY, UUID.randomUUID().toString());
                } else {
                    map.put(Constants.TOKEN_KEY, token);
                }
            }

    发送Token

      public RpcInvocation(Invocation invocation, Invoker<?> invoker) {
            this(invocation.getMethodName(), invocation.getParameterTypes(),
                    invocation.getArguments(), new HashMap<String, String>(invocation.getAttachments()),
                    invocation.getInvoker());
            if (invoker != null) {
                URL url = invoker.getUrl();
                setAttachment(Constants.PATH_KEY, url.getPath());
                if (url.hasParameter(Constants.INTERFACE_KEY)) {
                    setAttachment(Constants.INTERFACE_KEY, url.getParameter(Constants.INTERFACE_KEY));
                }
                if (url.hasParameter(Constants.GROUP_KEY)) {
                    setAttachment(Constants.GROUP_KEY, url.getParameter(Constants.GROUP_KEY));
                }
                if (url.hasParameter(Constants.VERSION_KEY)) {
                    setAttachment(Constants.VERSION_KEY, url.getParameter(Constants.VERSION_KEY, "0.0.0"));
                }
                if (url.hasParameter(Constants.TIMEOUT_KEY)) {
                    setAttachment(Constants.TIMEOUT_KEY, url.getParameter(Constants.TIMEOUT_KEY));
                }
                //是否含有token 如果有 则设置到attachment
                if (url.hasParameter(Constants.TOKEN_KEY)) {
                    setAttachment(Constants.TOKEN_KEY, url.getParameter(Constants.TOKEN_KEY));
                }
                if (url.hasParameter(Constants.APPLICATION_KEY)) {
                    setAttachment(Constants.APPLICATION_KEY, url.getParameter(Constants.APPLICATION_KEY));
                }
            }
        }

    认证token

    /**
     * TokenInvokerFilter
     * provider和consumer可用 含有参数 token
     * 文档:http://dubbo.apache.org/zh-cn/docs/user/demos/token-authorization.html
     */
    @Activate(group = Constants.PROVIDER, value = Constants.TOKEN_KEY)
    public class TokenFilter implements Filter {
    
        @Override
        public Result invoke(Invoker<?> invoker, Invocation inv)
                throws RpcException {
            // 获得服务提供者配置的 Token 值
            String token = invoker.getUrl().getParameter(Constants.TOKEN_KEY);
            if (ConfigUtils.isNotEmpty(token)) {
                Class<?> serviceType = invoker.getInterface();
                Map<String, String> attachments = inv.getAttachments();
                //获取消费者传入的tokne
                String remoteToken = attachments == null ? null : attachments.get(Constants.TOKEN_KEY);
                //进行校验
                if (!token.equals(remoteToken)) {
                    throw new RpcException("Invalid token! Forbid invoke remote service " + serviceType + " method " + inv.getMethodName() + "() from consumer " + RpcContext.getContext().getRemoteHost() + " to provider " + RpcContext.getContext().getLocalHost());
                }
            }
            return invoker.invoke(inv);
        }
    
    }
  • 相关阅读:
    Range
    cache
    从头到尾彻底解析Hash 表算法
    教你如何迅速秒杀掉:99%的海量数据处理面试题
    秒杀抢购思路以及高并发下数据安全
    Nginx+Tomcat负载均衡
    强大的Spring缓存技术(上)
    强大的Spring缓存技术(中)
    强大的Spring缓存技术(下)
    (转)C#中的 break 与continue 的使用和注意
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12504635.html
Copyright © 2020-2023  润新知