Rumah pangkalan data tutorial mysql 自定义Hive权限控制(3) 扩展Hive以实现自定义权限控制

自定义Hive权限控制(3) 扩展Hive以实现自定义权限控制

Jun 07, 2016 pm 04:31 PM
hive capai Kembangkan kawalan artikel kebenaran pengenalan Sesuaikan

简介 前两篇文章已经将需要的数据进行了准备,比如用户权限配置信息等。本节主要介绍我们的使用场景,因为使用场景的问题,我们只针对select进行相应的 权限控制 ,insert,delete,drop等动作从数据库层面上进行了限定,非本部门的人员是只拥有查询权限的。

简介
前两篇文章已经将需要的数据进行了准备,比如用户权限配置信息等。本节主要介绍我们的使用场景,因为使用场景的问题,我们只针对select进行相应的权限控制,insert,delete,drop等动作从数据库层面上进行了限定,非本部门的人员是只拥有查询权限的。所以在处理上会相对简单一些。
首先,建立一个工具包,用来处理相应的数据方面的请求。主要是获取用户权限的对应关系,并组织成我需要的格式。
包括3个类:

HiveTable.java是针对hive的table建立的对象类。MakeMD5.Java 是针对MD5密码加密使用的工具类。UserAuthDataMode.java 是用于获取用户权限的方法类,本类实现了按照需要的格式获取数据库中的信息。
Salin selepas log masuk

HiveTable类
package com.anyoneking.www;?import java.util.ArrayList;import java.util.List;?public class HiveTable {	private int id ;	private String tableName ;	private int dbid ;	private String dbName ;	private List partitionList = new ArrayList();	public int getId() {		return id;	}	public void setId(int id) {		this.id = id;	}	public String getTableName() {		return tableName;	}	public void setTableName(String tableName) {		this.tableName = tableName;	}	public int getDbid() {		return dbid;	}	public void setDbid(int dbid) {		this.dbid = dbid;	}	public String getDbName() {		return dbName;	}	public void setDbName(String dbName) {		this.dbName = dbName;	}	public List getPartitionList() {		return partitionList;	}	public void setPartitionList(List partitionList) {		this.partitionList = partitionList;	}?	public String getFullName(){		return this.dbName+"."+this.tableName;	}}
Salin selepas log masuk

UserAuthDataModel.java
package com.anyoneking.www;?import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.Statement;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;?import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.hadoop.hive.conf.HiveConf;import org.apache.hadoop.hive.ql.Driver;/**?* 用户认证类,用于从数据库中提取相关的信息。?* @author songwei?*?*/public class UserAuthDataMode {	static final private Log LOG = LogFactory.getLog(Driver.class.getName());	private HiveConf conf ;	private boolean isSuperUser = false; 	private Map allTableMap =new HashMap();	//auth db name List	private List dbNameList = new ArrayList();	//auth table name List ex:{"dbName.tableName":HiveTable}	private Map tableMap = new HashMap();?	//auth table excludeColumnList ex:{"dbName.tableName":["phone"]}	private Map> excludeColumnList = new HashMap>();	//auth table includeColumnList ex:{"dbName.tableName":["ptdate","ptchannel"]}	private Map> includeColumnList = new HashMap>();?	private List ptchannelValueList = new ArrayList();?	private String userName;	private String password;	private Connection conn ;	private int userid ;	private int maxMapCount =16;	private int maxRedCount =16;?	private void createConn() throws Exception{		Class.forName("com.mysql.jdbc.Driver");		String dbURL = HiveConf.getVar(this.conf,HiveConf.ConfVars.KUXUN_HIVESERVER_URL);		String dbUserName = HiveConf.getVar(this.conf,HiveConf.ConfVars.KUXUN_HIVESERVER_USER);		String dbPassword = HiveConf.getVar(this.conf,HiveConf.ConfVars.KUXUN_HIVESERVER_PASSWORD);				this.conn = DriverManager.getConnection(dbURL,dbUserName, dbPassword);				//this.conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","test", "tset");			}?	public UserAuthDataMode(String userName,String password,HiveConf conf) throws Exception{		this.userName = userName ;		this.password = password ;		this.conf = conf;		this.createConn();	}?	private ResultSet getResult(String sql) throws Exception{		Statement stmt = conn.createStatement();		ResultSet rs = stmt.executeQuery(sql);		return rs;	}?	private void checkUser() throws Exception{		MakeMD5 md5 = new MakeMD5();		String sql = "select username,password,id,is_superuser from auth_user where username='"+this.userName+"'"; 		LOG.debug(sql);		this.password = md5.makeMD5(this.password);		ResultSet rs= this.getResult(sql);		int size =0 ;		boolean flag = false ;		if(size != 0){			throw new Exception("username is error");		}		while(rs.next()){			size +=1 ;			this.userid = rs.getInt("id");			int superUser = rs.getInt("is_superuser");			if (superUser == 1){				this.isSuperUser = true ;				}else{				this.isSuperUser = false ;			}			String db_password = rs.getString("password");			if(db_password.equals(this.password)){				flag = true ;			}		}		if(size 0){				String[] pt = ptInfo.split(",");				ht.setPartitionList(Arrays.asList(pt));			}			this.allTableMap.put(tblid, ht);		}?		//处理有权限的db信息		String dbSql = " select t2.hivedb_id,(select name from hive_db where id = t2.hivedb_id) dbname"				+" from hive_user_auth t1 join hive_user_auth_dbGroups t2"				+" on (t1.id = t2.hiveuserauth_id)"				+"where t1.user_id ="+this.userid ;		ResultSet dbrs = this.getResult(dbSql);		while(dbrs.next()){			this.dbNameList.add(dbrs.getString("dbname"));		}?		//处理有权限的表信息		String tableSql = "select t2.hivetable_id "					+"from hive_user_auth t1 join hive_user_auth_tableGroups t2 "					+"on (t1.id = t2.hiveuserauth_id) "					+"where t1.user_id ="+this.userid ;		ResultSet tablers = this.getResult(tableSql);		while(tablers.next()){			int tableID = tablers.getInt("hivetable_id");			LOG.debug("-----"+tableID);			HiveTable ht = this.allTableMap.get(tableID);			LOG.debug("---table_name--"+ht.getTableName());			String tableFullName = ht.getFullName();			LOG.debug(tableFullName);			this.tableMap.put(tableFullName, ht);		}?		//处理不允许操作的列		String exSql = "select col.name,col.table_id,col.column "						+"from hive_user_auth t1 join hive_user_auth_exGroups t2 "						+"on (t1.id = t2.hiveuserauth_id) "						+"join hive_excludecolumn col "						+"on (t2.excludecolumn_id = col.id) "						+"where t1.user_id ="+this.userid ;		ResultSet exrs = this.getResult(exSql);		while(exrs.next()){			int tableID = exrs.getInt("table_id");			String column = exrs.getString("column");			HiveTable ht = this.allTableMap.get(tableID);			String tableFullName = ht.getFullName();			String[] columnList = column.split(",");			this.excludeColumnList.put(tableFullName, Arrays.asList(columnList));		}?		//处理必须包含的列		String inSql = "select col.name,col.table_id,col.column "			+"from hive_user_auth t1 join hive_user_auth_inGroups t2 "			+"on (t1.id = t2.hiveuserauth_id) "			+"join hive_includecolumn col "			+"on (t2.includecolumn_id = col.id) "			+"where t1.user_id ="+this.userid ;		ResultSet inrs = this.getResult(inSql);		while(inrs.next()){			int tableID = inrs.getInt("table_id");			String column = inrs.getString("column");			HiveTable ht = this.allTableMap.get(tableID);			String tableFullName = ht.getFullName();			String[] columnList = column.split(",");			this.includeColumnList.put(tableFullName, Arrays.asList(columnList));		}?		//处理ptchannel的value		String ptSql = "select val.name "		+"from hive_user_auth t1 join hive_user_auth_ptGroups t2 "		+"on (t1.id = t2.hiveuserauth_id) "		+"join hive_ptchannel_value val "		+"on (t2.hiveptchannelvalue_id = val.id) "		+"where t1.user_id ="+this.userid ;		ResultSet ptrs = this.getResult(ptSql);		while(ptrs.next()){			String val = ptrs.getString("name");			this.ptchannelValueList.add(val);		}			}?	public int getMaxMapCount() {		return maxMapCount;	}?	public void setMaxMapCount(int maxMapCount) {		this.maxMapCount = maxMapCount;	}?	public int getMaxRedCount() {		return maxRedCount;	}?	public void setMaxRedCount(int maxRedCount) {		this.maxRedCount = maxRedCount;	}?	public void run() throws Exception{		this.checkUser();		this.parseAuth();		this.checkData();		this.modifyConf();		this.clearData();	}?	public void clearData() throws Exception{		this.conn.close();	}?	private void modifyConf(){		this.conf.setInt("mapred.map.tasks",this.maxMapCount);		//this.conf.setInt("hive.exec.reducers.ma", this.maxRedCount);		HiveConf.setIntVar(this.conf,HiveConf.ConfVars.MAXREDUCERS,this.maxRedCount);	}?	private void checkData(){		LOG.debug(this.allTableMap.keySet().size());		LOG.debug(this.tableMap.keySet().size());		LOG.debug(this.dbNameList.size());		LOG.debug(this.excludeColumnList.size());		LOG.debug(this.includeColumnList.size());		LOG.debug(this.ptchannelValueList.size());	}????	public static void main(String[] args) throws Exception{		UserAuthDataMode ua = new UserAuthDataMode("swtest","swtest",null);		ua.run();	}?	public List getDbNameList() {		return dbNameList;	}?	public void setDbNameList(List dbNameList) {		this.dbNameList = dbNameList;	}?	public Map getTableMap() {		return tableMap;	}?	public void setTableMap(Map tableMap) {		this.tableMap = tableMap;	}?	public Map> getExcludeColumnList() {		return excludeColumnList;	}?	public void setExcludeColumnList(Map> excludeColumnList) {		this.excludeColumnList = excludeColumnList;	}?	public Map> getIncludeColumnList() {		return includeColumnList;	}?	public void setIncludeColumnList(Map> includeColumnList) {		this.includeColumnList = includeColumnList;	}?	public List getPtchannelValueList() {		return ptchannelValueList;	}?	public void setPtchannelValueList(List ptchannelValueList) {		this.ptchannelValueList = ptchannelValueList;	}?}
Salin selepas log masuk

MakeMD5.java

package com.anyoneking.www;?import java.math.BigInteger;import java.security.MessageDigest;?public class MakeMD5 {	public String makeMD5(String password) {		MessageDigest md;		try {			// 生成一个MD5加密计算摘要			md = MessageDigest.getInstance("MD5"); // 同样可以使用SHA1			// 计算md5函数			md.update(password.getBytes());			// digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符			// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值			String pwd = new BigInteger(1, md.digest()).toString(16); // 参数也可不只用16可改动,当然结果也不一样了			return pwd;		} catch (Exception e) {			e.printStackTrace();		}		return password;	}?	public static void main(String[] args) {		MakeMD5 md5 = new MakeMD5();		md5.makeMD5("swtest");	}}
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Dayakan kebenaran root dengan satu klik (dapatkan kebenaran root dengan cepat) Dayakan kebenaran root dengan satu klik (dapatkan kebenaran root dengan cepat) Jun 02, 2024 pm 05:32 PM

Ia membolehkan pengguna melakukan operasi yang lebih mendalam dan penyesuaian sistem kebenaran Root ialah kebenaran pentadbir dalam sistem Android. Mendapatkan keistimewaan root biasanya memerlukan satu siri langkah yang membosankan, yang mungkin tidak mesra pengguna biasa, bagaimanapun. Dengan mendayakan kebenaran root dengan satu klik, artikel ini akan memperkenalkan kaedah yang mudah dan berkesan untuk membantu pengguna mendapatkan kebenaran sistem dengan mudah. Fahami kepentingan dan risiko kebenaran root dan mempunyai kebebasan yang lebih besar keizinan Root membolehkan pengguna mengawal sepenuhnya sistem telefon mudah alih. Kuatkan kawalan keselamatan, sesuaikan tema dan pengguna boleh memadamkan aplikasi yang diprapasang. Sebagai contoh, pemadaman fail sistem secara tidak sengaja menyebabkan ranap sistem, penggunaan keistimewaan akar yang berlebihan dan pemasangan perisian hasad secara tidak sengaja juga berisiko, walau bagaimanapun. Sebelum menggunakan keistimewaan root

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Mar 24, 2024 am 11:27 AM

Bagaimana untuk melaksanakan log masuk WeChat dwi pada telefon mudah alih Huawei? Dengan kebangkitan media sosial, WeChat telah menjadi salah satu alat komunikasi yang sangat diperlukan dalam kehidupan seharian orang ramai. Walau bagaimanapun, ramai orang mungkin menghadapi masalah: log masuk ke beberapa akaun WeChat pada masa yang sama pada telefon mudah alih yang sama. Bagi pengguna telefon mudah alih Huawei, tidak sukar untuk mencapai log masuk WeChat dwi Artikel ini akan memperkenalkan cara mencapai log masuk WeChat dwi pada telefon mudah alih Huawei. Pertama sekali, sistem EMUI yang disertakan dengan telefon mudah alih Huawei menyediakan fungsi yang sangat mudah - pembukaan dua aplikasi. Melalui fungsi pembukaan dwi aplikasi, pengguna boleh serentak

Sambungan dan modul pihak ketiga untuk fungsi PHP Sambungan dan modul pihak ketiga untuk fungsi PHP Apr 13, 2024 pm 02:12 PM

Untuk melanjutkan fungsi fungsi PHP, anda boleh menggunakan sambungan dan modul pihak ketiga. Sambungan menyediakan fungsi dan kelas tambahan yang boleh dipasang dan didayakan melalui pengurus pakej pecl. Modul pihak ketiga menyediakan fungsi khusus dan boleh dipasang melalui pengurus pakej Komposer. Contoh praktikal termasuk menggunakan sambungan untuk menghuraikan data JSON yang kompleks dan menggunakan modul untuk mengesahkan data.

Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Panduan Pengaturcaraan PHP: Kaedah untuk Melaksanakan Jujukan Fibonacci Mar 20, 2024 pm 04:54 PM

Bahasa pengaturcaraan PHP ialah alat yang berkuasa untuk pembangunan web, yang mampu menyokong pelbagai logik dan algoritma pengaturcaraan yang berbeza. Antaranya, melaksanakan jujukan Fibonacci adalah masalah pengaturcaraan biasa dan klasik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa pengaturcaraan PHP untuk melaksanakan jujukan Fibonacci, dan melampirkan contoh kod tertentu. Jujukan Fibonacci ialah jujukan matematik yang ditakrifkan seperti berikut: unsur pertama dan kedua bagi jujukan ialah 1, dan bermula dari unsur ketiga, nilai setiap unsur adalah sama dengan jumlah dua unsur sebelumnya. Beberapa elemen pertama urutan

Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Mar 24, 2024 pm 06:03 PM

Bagaimana untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Dengan populariti perisian sosial dan penekanan yang semakin meningkat terhadap privasi dan keselamatan orang ramai, fungsi klon WeChat telah beransur-ansur menjadi tumpuan perhatian. Fungsi klon WeChat boleh membantu pengguna log masuk ke berbilang akaun WeChat pada telefon mudah alih yang sama pada masa yang sama, menjadikannya lebih mudah untuk diurus dan digunakan. Tidak sukar untuk melaksanakan fungsi klon WeChat pada telefon mudah alih Huawei Anda hanya perlu mengikuti langkah berikut. Langkah 1: Pastikan versi sistem telefon mudah alih dan versi WeChat memenuhi keperluan Pertama, pastikan versi sistem telefon mudah alih Huawei anda telah dikemas kini kepada versi terkini, serta Apl WeChat.

Proses pengendalian susun atur skrin tersuai edius Proses pengendalian susun atur skrin tersuai edius Mar 27, 2024 pm 06:50 PM

1. Gambar di bawah ialah susun atur skrin lalai bagi edius Tataletak tetingkap EDIUS lalai adalah susun atur mendatar Oleh itu, dalam persekitaran monitor tunggal, banyak tetingkap bertindih dan tetingkap pratonton berada dalam mod tetingkap tunggal. 2. Anda boleh mendayakan [Dual Window Mode] melalui bar menu [View] untuk menjadikan tetingkap pratonton memaparkan tetingkap main balik dan tetingkap rakaman pada masa yang sama. 3. Anda boleh memulihkan reka letak skrin lalai melalui [Lihat bar menu>Reka Letak Tetingkap>Umum]. Selain itu, anda juga boleh menyesuaikan reka letak yang sesuai dengan anda dan menyimpannya sebagai susun atur skrin yang biasa digunakan: seret tetingkap ke susun atur yang sesuai dengan anda, kemudian klik [Lihat > ​​Reka Letak Tetingkap > Simpan Reka Letak Semasa > Baharu], dan dalam pop timbul [Save Current Layout] Layout] masukkan nama susun atur dalam tetingkap kecil dan klik OK

Penanda Aras Prestasi ORM Python: Membandingkan Rangka Kerja ORM Berbeza Penanda Aras Prestasi ORM Python: Membandingkan Rangka Kerja ORM Berbeza Mar 18, 2024 am 09:10 AM

Rangka kerja pemetaan hubungan objek (ORM) memainkan peranan penting dalam pembangunan ular sawa, ia memudahkan akses dan pengurusan data dengan membina jambatan antara objek dan pangkalan data hubungan. Untuk menilai prestasi rangka kerja ORM yang berbeza, artikel ini akan menanda aras terhadap rangka kerja popular berikut: sqlAlchemyPeeweeDjangoORMPonyORMTortoiseORM Kaedah Ujian Penanda aras menggunakan pangkalan data SQLite yang mengandungi 1 juta rekod. Ujian melakukan operasi berikut pada pangkalan data: Masukkan: Masukkan 10,000 rekod baharu ke dalam jadual Baca: Baca semua rekod dalam jadual Kemas kini: Kemas kini satu medan untuk semua rekod dalam jadual Padam: Padam semua rekod dalam jadual Setiap operasi

Aplikasi Python ORM dalam projek data besar Aplikasi Python ORM dalam projek data besar Mar 18, 2024 am 09:19 AM

Pemetaan hubungan objek (ORM) ialah teknologi pengaturcaraan yang membolehkan pembangun menggunakan bahasa pengaturcaraan objek untuk memanipulasi pangkalan data tanpa menulis pertanyaan SQL secara langsung. Alat ORM dalam python (seperti SQLAlchemy, Peewee dan DjangoORM) memudahkan interaksi pangkalan data untuk projek data besar. Kelebihan Kesederhanaan Kod: ORM menghapuskan keperluan untuk menulis pertanyaan SQL yang panjang, yang meningkatkan kesederhanaan dan kebolehbacaan kod. Abstraksi data: ORM menyediakan lapisan abstraksi yang mengasingkan kod aplikasi daripada butiran pelaksanaan pangkalan data, meningkatkan fleksibiliti. Pengoptimuman prestasi: ORM sering menggunakan operasi caching dan kelompok untuk mengoptimumkan pertanyaan pangkalan data, dengan itu meningkatkan prestasi. Mudah alih: ORM membenarkan pembangun untuk

See all articles