关于深入实训——自定义安全机制作业的疑问

按照作业要求在UserGroupInfomation的commit方法里实现了一段自定义的逻辑,就是用java读文件的方式从一个自定义的配置文件中读到了用户名,但感觉不够优雅,想知道hadoop源码中有没有相关的工具类可以或者参考逻辑,可以直接读取自定义配置文件中的参数(配置文件可能不是xml格式的,而是一个普通的文本文件,Configuration.addResource只能添加xml格式的自定义配置文件?),另外如果发送到namenode做用户名、密码验证的话是不是需要做一个到namenode的RPC调用?关于这个作业老师多给点提示或参考代码吧,谢谢

fish - Hadooper

赞同来自:

配置文件是我们自己定义的格式的话,可以定义成Java Property的格式,这样就可以用Java的Property的读取方式“优雅”的读配置了。   不需要在namenode多加RPC这么麻烦,可以考虑基于namenode已经有的http服务,多加一个类似login这样的服务就可以。   在客户端,用类似如下的代码段进行登录识别(这是真实场景的代码,可以忽略一些cache细节,关注http发起部分的逻辑):
    public static boolean remoteLogin(String userName, String password) {
      if (userCached(userName)) {
        return true;
      }

      String authServerAddresses = conf.get("hadoop.security.auth.server.address");
      String[] authServerAddressArray = authServerAddresses.split(",");
      List<String> authServerAddressList = Arrays.asList(authServerAddressArray);
      Collections.shuffle(authServerAddressList);
      for (String authServerAddress : authServerAddressList) {
        try {
          String urlAddress = authServerAddress + "/login?user="
            + userName + "&password=" + password;
          // LOG.info(" login address " + urlAddress);
  
          URL url = new URL(urlAddress);
          HttpURLConnection uRLConnection = (HttpURLConnection)url.openConnection();
          InputStream is = uRLConnection.getInputStream();
          BufferedReader br = new BufferedReader(new InputStreamReader(is));
          String response = "";
          String readLine = null;
          while((readLine =br.readLine()) != null){
            response = response + readLine;
          }
          is.close();
          br.close();
          uRLConnection.disconnect();
  
          if ("pass".equals(response)) {
            // cache the user
            appendUser(userName);
            return true;
          } else {
            return false;
          }
        } catch (Exception e) {
          LOG.warn("Log fail to " + authServerAddress + ", try other services.");
        }
      }
      return false;
    }
在namenode侧,在NameNodeHttpServer中,参考已经有的Servlet,添加一个处理login请求的Servlet。

要回复问题请先登录注册