#1.测试类
想运行hadoop的测试类,我们必须先编译hadoop

mac下编译hadoop-2.7.4

然后查看测试类

org.apache.hadoop.hdfs.server.namenode.TestINodeAttributeProvider
  • 1

然后直接运行testDelegationToProvider这个测试类方法,就可以运行,并且在

@Override
      public void checkPermission(String fsOwner, String supergroup,
          UserGroupInformation ugi, INodeAttributes[] inodeAttrs,
          INode[] inodes, byte[][] pathByNameArr, int snapshotId, String path,
          int ancestorIndex, boolean doCheckOwner, FsAction ancestorAccess,
          FsAction parentAccess, FsAction access, FsAction subAccess,
          boolean ignoreEmptyDir) throws AccessControlException {

          System.out.println("=========="+fsOwner);
        System.out.println("=========="+supergroup);
        System.out.println("=========="+ugi);
        System.out.println("=========="+inodeAttrs);
        System.out.println("=========="+inodes);
        System.out.println("=========="+pathByNameArr);
        System.out.println("=========="+snapshotId);
        System.out.println("=========="+path);
        System.out.println("=========="+ancestorIndex);
        System.out.println("=========="+doCheckOwner);
        System.out.println("=========="+ancestorAccess);
        System.out.println("=========="+parentAccess);
        System.out.println("=========="+access);
        System.out.println("=========="+subAccess);
        System.out.println("=========="+ignoreEmptyDir);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

方法中打印出我们需要的内容

/**
         fsOwner = lcc
         supergroup = supergroup
         ugi = u1 (auth:SIMPLE)
         inodeAttrs = [Lorg.apache.hadoop.hdfs.server.namenode.INodeAttributes;@6a93a149
         inodes = [Lorg.apache.hadoop.hdfs.server.namenode.INode;@31d3da26
         pathByNameArr = [[B@35308ff8
         snapshotId = 2147483646
         path = /tmp/foo
         ancestorIndex = 1
         doCheckOwner = false
         ancestorAccess = null
         parentAccess = null
         access = READ_EXECUTE
         subAccess = null
         ignoreEmptyDir = false
         */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

但是注意看方法

 @Before
  public void setUp() throws IOException {
    CALLED.clear();
    Configuration conf = new HdfsConfiguration();
    String name = MegrezHdfsAuthorizer.class.getName();
    conf.set(DFSConfigKeys.DFS_NAMENODE_INODE_ATTRIBUTES_PROVIDER_KEY,
        MyAuthorizationProvider.class.getName());
//            name);
    conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_KEY, true);
    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);
    miniDFS = new MiniDFSCluster.Builder(conf).build();
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这个方法设置了两个重要的属性

 public static final String  DFS_NAMENODE_INODE_ATTRIBUTES_PROVIDER_KEY = "dfs.namenode.inode.attributes.provider.class";
   public static final String  DFS_NAMENODE_ACLS_ENABLED_KEY = "dfs.namenode.acls.enabled";
  • 1
  • 2

2.不修改源代码,实现自定义权限

新建一个maven项目,在/Users/lcc/IdeaProjects/hadoop-hdfs/src/main/java/目录下新建一个包package org.apache.hadoop.hdfs.server.namenode;(这个包位置很重要,一定要是和org.apache.hadoop.hdfs.server.namenode.INodeAttributeProvider这个类一样的目录),然后新建类MyHdfsAuthorizer.java
书写代码

package org.apache.hadoop.hdfs.server.namenode;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.permission.FsAction;
import org.apache.hadoop.security.UserGroupInformation;

import java.security.AccessControlException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * HDFS 鉴权具体的实现
 *
 * @author hulb
 * @date 2018/7/11 下午3:17
 * <p>
 * cp hdfs-auth/target/hdfs-auth-spark2.0.jar  /Users/hulb/opt/third/hadoop/share/hadoop/hdfs/lib/
 * <p>
 * 实现思路:
 * 还需要加一个权限列表的缓存。
 */
public class MyHdfsAuthorizer extends INodeAttributeProvider {

    private static final Log LOG = LogFactory.getLog(MegrezHdfsAuthorizer.class);

    @Override
    public void start() {
        System.out.println("MegrezHdfsAuthorizer 启动");
    }

    @Override
    public void stop() {
        System.out.println("MegrezHdfsAuthorizer 停止");
    }

    /**
     * 必须重写的方法
     * @param deafultEnforcer
     * @return
     */
    @Override
    public AccessControlEnforcer getExternalAccessControlEnforcer(
            AccessControlEnforcer deafultEnforcer) {
        return new MegrezAccessControlEnforcer();
    }

    /**
     * cc@lcc ~$ hdfs dfs -ls /user/hive /user/lcc
     *
     * @param pathElements 这里的fullPath是我们操作Hdfs时候的全路径
     *                 比如:        hdfs dfs -ls /
     *                 那么全路径是
     *                 /
     *                 /hadoop
     *                 /ranger
     *                 比如:        hdfs dfs -ls /
     *                 那么全路径是
     *                 /hadoop/
     *                 /hadoop/tempdata
     * @param inode    路径:/hadoop/tempdata
     *                 getGroupName            : supergroup
     *                 getUserName             : lcc
     *                 getAccessTime           : 0
     *                 getAclFeature           : null
     *                 getFsPermission         : rwxr-xr-x
     *                 getFsPermissionShort    : 493
     *                 getLocalNameBytes       : [B@50af74e1
     *                 getModificationTime     : 1530179365668
     *                 getXAttrFeature         : null
     *                 isDirectory             : true
     *                 toString                : tempdata
     * @return
     */

    @Override
    public INodeAttributes getAttributes(String[] pathElements,
                                          INodeAttributes inode) {
//        for(int i=0;i<pathElements.length;i++){
//            System.out.println(pathElements[i].toString());
//        }
        return inode;
    }

    public  class MegrezAccessControlEnforcer implements AccessControlEnforcer {

        private ConcurrentMap<String, UserAction> allPass =
                new ConcurrentHashMap<String, UserAction>();

		/**
	     * 必须重写的方法
	     * 改方法会被系统自动调用
	     * /
        @Override
        public void checkPermission(String fsOwner, String supergroup,
                                    UserGroupInformation ugi, INodeAttributes[] inodeAttrs,
                                    INode[] inodes, byte[][] pathByNameArr, int snapshotId, String path,
        

然后修改$HADOOP_HOME/etc/hadoop/hdfs-site.xml

<configuration>

        <property>
                 <name>dfs.replication</name>
                 <value>1</value>
        </property>
        <property>
                <name>dfs.permissions</name>
                <value>false</value>
        </property>
        <property>
                <name>www.fengshen157.com/ dfs.permissions</name>
                <value>true</value>
        </property>

        <property>
                <name>dfs.permissions.umask-mode</name>
                <value>077</value>
         </property>
        <property>
                <name>dfs.permissions.enabled</name>
                <value>true</value>
         </property>
        <property>
                <name>dfs.namenode.acls.enabled</name>
                <value>true</value>
lcc@lcc ~$ cp ~/IdeaProjects/spark-authorizer/hadoop_hdfs/target/hdfs-auth-spark2.0.jar /Users/lcc/soft/hadoop/hadoop/share/hadoop/hdfs/lib/
  • 1

然后重启集群

lcc@lcc hadoop$ sbin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
18/07/16 15:44:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [lcc]
lcc: starting namenode, logging to /Users/lcc/soft/hadoop/hadoop/logs/hadoop-lcc-namenode-lcc.out
localhost: starting datanode, logging to /Users/lcc/soft/hadoop/hadoop/logs/hadoop-lcc-datanode-lcc.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /Users/lcc/soft/hadoop/hadoop/logs/hadoop-lcc-secondarynamenode-lcc.out
18/07/16 15:45:17 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
starting yarn daemons
starting resourcemanager, logging to /Users/lcc/soft/hadoop/hadoop/logs/yarn-lcc-resourcemanager-lcc.out
localhost: starting nodemanager,www.yongshiyule178.com logging to /Users/lcc/soft/hadoop/hadoop/logs/yarn-lcc-nodemanager-lcc.out
lcc@lcc hadoop$

然后测试

lcc@lcc ~$ hdfs dfs -mkdir  /lcc6
18/07/16 14:27:36 WARN util.NativeCodeLoader:www.taohuayuan178.com/ Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  • 1
  • 2

然后查看日志

lcc@lcc ~$ tail -100 /Users/lcc/soft/hadoop/hadoop/logs/hadoop-lcc-namenode-lcc.out
MegrezHdfsAuthorizer 启动
调用了本地重写的getAttributes方法
调用了本地重写的getAttributes方法
调用了本地重写的getAttributes方法
调用了本地重写的getAttributes方法
ax memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) www.leyouzaixan.cn 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

然后他妈的尴尬了,这里竟然每调用到内部类checkPermission方法

@Override
        public void checkPermission(String fsOwner, String supergroup,
                                    UserGroupInformation ugi, INodeAttributes[] inodeAttrs,
                                    INode[] inodes, byte[][] pathByNameArr, int snapshotId, String path,
                                    int ancestorIndex, boolean doCheckOwner, FsAction ancestorAccess,
                                    FsAction parentAccess, FsAction access, FsAction subAccess,
                                    boolean ignoreEmptyDir) throws AccessControlException {

这个问题已经解决,原来是使用命令不会调用,实用程序调用就可以了
比如

hdfs dfs -mkdir /lcc12
  • 1

用程序调用就可以了


    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.4</version>
        </dependency>

    </dependencies>
package com.lcc.hadoop.test;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

public class MyMkdir {
    public static void main(String[] args)throws Exception{
        FileSystem fs = FileSystem.get(new URI("hdfs://lcc:9000"),new Configuration(),"root");
        //测试创建一个文件夹,在HDFS上创建一个leitao文件夹,原根目录下使没有这个文件的
        boolean flag = fs.mkdirs(new Path("/leitao3"));

这是一个大坑,具体为撒不一样,可能是命令和FileSystem内部实现是不一样的

hadoop自定义权限的更多相关文章

  1. Android自定义权限和使用权限

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 自定义权限,主要用于保护被赋予权限的组件.如无权限与有权限,正如public与private的对类保 ...

  2. Android权限安全(3)权限的分级和自定义权限

    Android的不同权限分级 Normal 一般apk都可以用, Dangerous 一般apk都可以用,但有提示 SignatureOrSystem 特定的private key签名的或系统的apk ...

  3. android - 解决“应用自定义权限重名”

    背景 现场的开发今天跟我说,测试包装不上!报错"应用自定义权限重名"!!! 网上百度下关键字,发现魅族手机有这个毛病,顺藤摸瓜:"http://bbs.flyme.cn/ ...

  4. 关于 DotNetCore 的自定义权限管理

    1.自定义权限需要扩展 Microsoft.AspNetCore.Authentication 实现一套接口 IAuthenticationHandler, IAuthenticationSignIn ...

  5. SharePoint REST API - 使用REST接口对列表设置自定义权限

    博客地址:http://blog.csdn.net/FoxDave SharePoint网站.列表和列表项都属于SecurableObject类型.默认情况下,一个安全对象继承父级的权限.对一个对 ...

  6. Salesforce自定义权限简介

    自定义权限(Custom Permission) Salesforce默认提供了多种方式设定用户的权限,比如简档.权限集等.在这些设定中,已经包括了系统中的对象.应用.字段.页面布局等组件,管理员或开 ...

  7. 如何给EOS账户设置自定义权限

    https://bihu.com/article/1508858 EOS从上线以后,不断有传出token被盗的消息,安全无小事,我们一定要重视,今天从EOS帐户自己定义权限的角度来谈谈如何做好账户的安 ...

  8. Android自定义权限

    一.自定义权限 自定义权限,一般是考虑到应用共享组件时的安全问题.我们知道在四大组件 AndroidManifest 中注册的时候,添加 exported = "true" 这一属 ...

  9. Orchard 前台权限与自定义权限

    一:关于前台权限 1:只允许自己看到 首先,我们需要确定在 Role 设置页面,用户所对应的 View Page by others 和 View all content 未被选中.备注,我们首先和得 ...

随机推荐

  1. Python 之继承

    概要 如果要修改现有类的行为,我们不必再从头建一个新的类,可以直接利用继承这一功能.下面将以实例相结合介绍继承的用法.   新建一个基类 代码如下: class Marvel(object): num ...

  2. 大蟒蛇肚子的"风暴"

    遇到了数据库连接数不足的问题,一般情况下会预留一些会话增加的情况,但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据库Han ...

  3. springboot中加入druid对sql进行监控

    springboot作为现在十分流行的框架,简化Spring应用的初始搭建以及开发过程,现在我们就使用springboot来进行简单的web项目搭建并对项目sql进行监控. 项目的搭建就省略了,spr ...

  4. 让你提高效率的 Linux 技巧

    想要在 Linux 命令行工作中提高效率,你需要使用一些技巧. 巧妙的 Linux 命令行技巧能让你节省时间.避免出错,还能让你记住和复用各种复杂的命令,专注在需要做的事情本身,而不是你要怎么做.以下 ...

  5. 课时5.什么是URL(理解)

    其实浏览器的地址栏中输入的地址就是一个URL. http://127.0.0.1/index.html(浏览器会自动添加:80) http://127.0.0.1:80/index.html(这是浏览 ...

  6. ZendFramework-2.4 源代码 - 关于MVC - Model层类图

  7. Pychram基本操作

    1. 更改pychram页面为黑色背景主题.更改主题: File ->Settings -> Editor -> Color Scheme -> Scheme -> Mo ...

  8. RGB色彩的计算机表示

    计算机显示模式[编辑] 24比特模式[编辑] 每像素24位(比特s per pixel,bpp)编码的RGB值:使用三个8位无符号整数(0到255)表示红色.绿色和蓝色的强度.这是当前主流的标准表示方 ...

  9. Bomb HDU - 3555 (数位DP)

    Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...

  10. B - Sonya and Exhibition CodeForces - 1004B (思维题)

    B. Sonya and Exhibition time limit per test 1 second memory limit per test 256 megabytes input stand ...