建议操作方式
因为权限中涉及的用户和组都是Linux的,不可控。建议使用角色,用户可以放置在角色中同时可以为角色进行授权。具体步骤如下:
1.创建角色
create role testrole;
2.给角色授权
grant select on database default to role admin;
3.给角色添加用户
grant role testrole to user userA;
常用命令查询...
1.给用户授权
基于数据库
grant select on database default to useradmin;
基于某张表:
grant select on table ppdata to user admin;
2.给组授权
基于数据库:
grant select on database default to group admin;
基于某张表
grant select on table ppdata to group admin;
3.给角色授权
基于数据库:
grant select on database default to role admin;
基于某张表
grant select on table ppdata to role admin;
4.创建角色
create role testrole;
5.给用户添加角色
grant role testrole to user userA;
6.给用户移除权限
基于数据库:
revoke select on database default from useruserB;
基于某张表
revoke select on table ppdata from useruserB;
名称 |
描述 |
ALL |
赋予所有的权限 |
ALTER |
有修改表结构的权限 |
CREATE |
有创建表的权限 |
DROP |
有删除表或表中的分区的权限 |
LOCK |
开启并发后,锁定和解锁定表的权限 |
SELECT |
查询表或者分区中数据的权限 |
SHOW_DATABASE |
查看所有数据库的权限 |
UPDATE |
向表或者分区中插入或加载数据的权限 |
权限配置
1.在hive-site.xml中进行配置:
功能:开启权限。
功能:表的创建者对表拥有所有权限。
进行权限控制的配置。
此处错误总结:
报错:The current builtin authorization in Hive isincomplete and disabled.
类结构:
错误分析:
1.根据报错“The current builtin authorization in Hive is incomplete anddisabled.”,找到org.apache.hadoop.hive.ql.parse.authorization. RestrictedHiveAuthorizationTaskFactoryImpl
2.发现在做权限处理时候,这个类针对任何操作(指对hive中的sql语句做权限处理)都报错。
3.排查到org.apache.hadoop.hive.ql.parse.authorization. HiveAuthorizationTaskFactoryFactory类中进行参数配置getClass(HiveConf.ConfVars.HIVE_AUTHORIZATION_TASK_FACTORY.varname,
HiveAuthorizationTaskFactoryImpl.class,
HiveAuthorizationTaskFactory.class);
4.查看HIVE_AUTHORIZATION_TASK_FACTORY的配置:HIVE_AUTHORIZATION_TASK_FACTORY("hive.security.authorization.task.factory",
"org.apache.hadoop.hive.ql.parse.authorization.RestrictedHiveAuthorizationTaskFactoryImpl"),
默认的就是那个全部进行报错处理的类。
5.根据RestrictedHiveAuthorizationTaskFactoryImpl实现HiveAuthorizationTaskFactory类,找到一样实现此类的抽象类:AbstractHiveAuthorizationTaskFactory,最后找到继承此抽象类的HiveAuthorizationTaskFactoryImpl,进行配置即可。
使用钩子程序,识别超级管理员,进行授权控制。
涉及的Java代码:
package com.myHook;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.session.SessionState;
public classMyAuthHook extendsAbstractSemanticAnalyzerHook {
private static String admin = "admin";
@Override
public ASTNodepreAnalyze(HiveSemanticAnalyzerHookContext context,
ASTNodeast)throwsSemanticException {
switch (ast.getToken().getType()) {
case HiveParser.TOK_CREATEDATABASE:
case HiveParser.TOK_DROPDATABASE:
case HiveParser.TOK_CREATEROLE:
case HiveParser.TOK_DROPROLE:
case HiveParser.TOK_GRANT:
case HiveParser.TOK_REVOKE:
case HiveParser.TOK_REVOKE_ROLE:
case HiveParser.TOK_GRANT_ROLE:
case HiveParser.TOK_IMPORT:
case HiveParser.TOK_SHOW_ROLES:
StringuserName= null;
if (SessionState.get()!= null
&&SessionState.get().getAuthenticator()!= null){
userName = SessionState.get().getAuthenticator().getUserName();
}
if (!admin.equalsIgnoreCase(userName)) {
throw new SemanticException(userName
+" can't use ADMIN options, except" + admin + ".");
}
break;
default:
break;
}
return ast;
}
}
之后把此类达成jar包,放到hive的lib目录下。
此处错误总结:
错误:此类没有起作用。
1.如何验证是否调用了此类?
方法:故意写错类名称,当在hive中写sql语句的时候,会报找不到类,说明这个类可以被调到。
错误原因:hive 0.13.1和0.12.0版本中ast.getToken().getType()的数值和HiveParser中对应的值不对应所致。
解决方法:在Java代码中添加System.out.print(ast.getToken().getType());这样在hive中执行sql语句的时候,会打印出具体的类型的数值。根据数值在HiveParser类中找到对应的属性名称(例如:public static final int TOK_TABCOLVALUE = 793;),添加到钩子程序中。