搞定linux上MySQL编程(四):mysql权限管理

【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】

mysql中提供了比较完整的安全/权限管理系统,下面简单介绍权限的原理和使用。

mysql数据库安装完成启动之后,能看当前数据库列表可以看到一个mysql的数据库:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+

该数据库是MySQL用来存储所有授权信息,该数据库由若干张数据表组成,具体数据表如下:

mysql> use mysql
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
23 rows in set (0.00 sec)

在这些数据表中,涉及全县控制的有5张表,分别是columns_priv(为某一张表中单个列进行访问权限设定) 、db(对给定数据库的所有表设定访问权限)、host(对访问ip地址进行权限设定)、tables_priv(对用户的存储过程进行权限设定)、user(用于管理MySQL的用户)等。

在MySQL中采用两个阶段来进行权限的存取与控制,这两个阶段为:

1.当用户发起连接时,MySQL服务器先检查user表,检查方式是通过用户名、密码、主机的组合判断用户是否为授权用户,不是则直接拒绝。

2.若连接成功,对于提交的请求,MySQL将通过顺序检查db、host、tables_priv、columns_priv判断是否存在访问权限。

在MySQL中尽量不要使用超级用户登录,因为这样很容易带来安全隐患,比较正确的方式是设置一个超级用户,同时设置几个普通用户,这样可以分层分级来实现数据的安全管理。

新增加用户可以使用cerate user命令、使用grand授权、或向用户表user中直接添加用户记录等方式来完成。

mysql> create user allen identified by 'allen' ;
Query OK, 0 rows affected (0.39 sec)  <span style="font-family: 微软雅黑;">      </span>

查看当前所有用户权限表:

mysql> select user,host,super_priv from user;
+------+-----------------------+------------+
| user | host                  | super_priv |
+------+-----------------------+------------+
| root | localhost             | Y          |
| root | localhost.localdomain | Y          |
| root | 127.0.0.1             | Y          |
|      | localhost             | N          |
|      | localhost.localdomain | N          |
| allen | %                     | N          |
+------+-----------------------+------------+
6 rows in set (0.00 sec)

mysql> 

删除用户可以使用drop语句完成,也可以使用revoke方式、或者使用delete语句删除user表中对于user记录来完成同样工作。

mysql> drop user allen;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host,super_priv from user;
+------+-----------------------+------------+
| user | host                  | super_priv |
+------+-----------------------+------------+
| root | localhost             | Y          |
| root | localhost.localdomain | Y          |
| root | 127.0.0.1             | Y          |
|      | localhost             | N          |
|      | localhost.localdomain | N          |
+------+-----------------------+------------+
5 rows in set (0.00 sec)

使用grant语句为用户授予权限,其格式为:

grant priv_set on dbname to username;

其中priv_set为权限集合,dbname是指数据库对象,username为用户。

现在来看看前面创建的用户:

[[email protected] ~]# mysql -u allen -p -h 172.27.35.8
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
mysql>

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_users           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> usse db_users;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'usse db_users' at line 1

发现用户allen无法使用db_users数据库,退出登陆后使用root用户给allen赋予所有权限。

mysql> grant all privileges on *.* to [email protected]; 

再次使用allen登陆后:

[[email protected] ~]# mysql -u allen -p -h 172.27.35.8
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
mysql> use db_users;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 

发现可以使用数据库了。

事实上对于新创建的用户,如果没有获得授权,是无法进行数据管理工作的。在实际应用中,grant可以执行用户创建,也可以对多用户在多个级别上进行权限管理,分别是,全局级、数据库级、数据表级以及字段级。下面分别从这4个层级对grant的使用进行介绍。

1.全局权限分配,可以为某个新建用户分配全部操作权限,这些权限存储在mysql.user表中,

grant all privileges on *.* to username@ ‘%‘

该语句能授权username用户在任意一台主机上对数据库服务器进行管理。虽然username拥有全部管理权限,但并没有为其自身分配再授予权限,所以不能为新创建的用户分配任何权限。以上面allen为例:

[[email protected] ~]# mysql -u allen -p -h 172.27.35.8
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
mysql> create user allen_test1 identified by 'allen_test';
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on *.* to [email protected];
ERROR 1045 (28000): Access denied for user 'allen'@'%' (using password: YES)
mysql> 

如果想让allen获得grant的操作权限,应该这样写:

grant all privileges on *.* to [email protected]‘%‘ with grant option;

如下:

[[email protected] ~]# mysql -u root -p
Enter password:
......
mysql> grant all privileges on *.* to [email protected]'%' with grant option;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit

[[email protected] ~]# mysql -u allen -p -h 172.27.35.8
Enter password:
......
mysql> grant select on *.* to [email protected];
Query OK, 0 rows affected (0.00 sec)

发现现在allen用户给allen_test授权成功。

2.数据库级权限范围是在给定的一个数据库中的所有目标的操作权限,这些权限会存储在mysql.db和mysql.host中。其语法为:

[[email protected] ~]# mysql -u root -p
Enter password:
......
mysql> grant all privileges on db_users.* to [email protected]'%'  identified by 'allen';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

然后使用allen_test2用户登录:

[[email protected] ~]# mysql -u allen_test2 -p -h 192.168.65.30
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
mysql> use db_users;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table tb_test(name varchar(32), sex bool);
Query OK, 0 rows affected (0.06 sec)

mysql> insert into tb_test values ('allen', 1);
Query OK, 1 row affected (0.00 sec)

mysql> create database db_test;
ERROR 1044 (42000): Access denied for user 'allen_test2'@'%' to database 'db_test'
mysql> 

可以看到,如果执行db_users数据库内操作是可以的,但创建一个新的数据库就会出错。说明数据库级权限已经生效 。

3.数据表级权限范围是在给定的一个数据表中所有的目标的操作权限,这些权限会存储在mysql.tables_priv中,通常一个数据表所拥有的权限有select、insert、delete、update等。下面为一个用户创建一个只有select的权限:

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> grant select on db_users.* to [email protected]'%' identified by 'allen';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> quit
Bye

使用用户allen_test3用户登录:

[[email protected] ~]# mysql -u allen_test3 -p -h 192.168.65.30
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql> select * from tb_test;
+-------+------+
| name  | sex  |
+-------+------+
| allen |    1 |
+-------+------+
1 row in set (0.00 sec)

mysql> insert into tb_test values ('Lily', 0);
ERROR 1142 (42000): INSERT command denied to user 'allen_test3'@'192.168.65.30' for table 'tb_test'
mysql> 

可见执行查询操作是可以的,但是执行插入操作出错。

4.字段级是在字段一级对用户进行全线管理,设定用户只有若干字段的某些操作权限,字段的权限信息存储在mysql.columns_priv表中。下例对一个新用户赋予db_users数据库中tb_test表的sex字段查看和更新的权限。

[[email protected] ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> grant select,update(sex) on db_users.tb_test to [email protected]'%' identified by 'allen';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> quit
Bye

allen_test4用户登录验证权限授予是否成功:

[[email protected] ~]# mysql -u allen_test4 -p -h 192.168.65.26
Enter password:
......
mysql> use db_users;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from tb_test;
+-------+------+
| name  | sex  |
+-------+------+
| allen |    1 |
+-------+------+
1 row in set (0.00 sec)

mysql> update tb_test set sex=0 where name='allen';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tb_test;
+-------+------+
| name  | sex  |
+-------+------+
| allen |    0 |
+-------+------+
1 row in set (0.00 sec)

mysql> update tb_test set name='allen_new';
ERROR 1143 (42000): UPDATE command denied to user 'allen_test4'@'192.168.65.26' for column 'name' in table 'tb_test'
mysql>

可以看到select权限没有问题,也可以对sex字段进行更新操作。但是更新name字段报错,因为没有授予其权限。

使用show grants可以查看用户已经获得的权限,查看自己的操作权限使用show grants命令可以查看自身权限,使用show grants for username可以查看用户username的权限。下例为查看root用户自身和查看allen_test4的操作权限:

[[email protected] ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
......
mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for allen_test4;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test4'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
| GRANT SELECT, UPDATE (sex) ON `db_users`.`tb_test` TO 'allen_test4'@'%'                                    |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

和grant相反的操作时使用revoke操作,revoke作用是回收或者取消权限。

1.撤销全部权限,

mysql> show  grants for allen_test2;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test2'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
| GRANT ALL PRIVILEGES ON `db_users`.* TO 'allen_test2'@'%'                                                  |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke all privileges, grant option from allen_test2;
Query OK, 0 rows affected (0.00 sec)

mysql> show  grants for allen_test2;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test2'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>

2.撤销表级某类权限,例如用户allen_test3权限如下:

mysql> show  grants for allen_test3;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test3'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
| GRANT SELECT ON `db_users`.* TO 'allen_test3'@'%'                                                          |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

执行撤销后权限如下:

mysql> revoke select on db_users.* from allen_test3;
Query OK, 0 rows affected (0.00 sec)

mysql> show  grants for allen_test3;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test3'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> 

3.撤销某字段权限,例如allen_test4权限如下:

mysql> show  grants for allen_test4;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test4'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
| GRANT SELECT, UPDATE (sex) ON `db_users`.`tb_test` TO 'allen_test4'@'%'                                    |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

可见用户allen_test4拥有select和update 字段sex的权限,现在撤销update的sex字段,如下:

mysql> revoke update(sex) on db_users.tb_test from allen_test4;
Query OK, 0 rows affected (0.00 sec)

mysql> show  grants for allen_test4;
+------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'allen_test4'@'%' IDENTIFIED BY PASSWORD '*C94FD2FCBF408CBBFAAB9C07FF4221D265AFB18F' |
| GRANT SELECT ON `db_users`.`tb_test` TO 'allen_test4'@'%'                                                  |
+------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> 

最后附上查看所有用户的sql语句:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select user from user;
+-------------+
| user        |
+-------------+
| allen_test2 |
| allen_test3 |
| allen_test4 |
| root        |
|             |
| root        |
|             |
| root        |
+-------------+

权限管理就到此为止了。

时间: 2024-10-28 14:49:23

搞定linux上MySQL编程(四):mysql权限管理的相关文章

搞定linux上MySQL编程(六):C语言编写MySQL程序(结)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在实际应用中,我们不可能在命令行登录进数据库进行数据的查询.插入等操作,用户一般是使用一个界面良好的应用程序软件来对数据进行管理.为了方便应用程序的开发,MySQL提供了多种编程语言(C.perl.php等)的编程接口,供开发者使用. 对于C语言来说,MySQL提供了C语言客户机库,它允许从任何C程序的内部访问MySQL数据库,客户机实现API,API定义了客户机如何建立和执

搞定linux上MySQL编程(二):MySQL语法基础操作

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] sql(structured query language)是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统. sql语言包含3部分: 1. 数据定义语言(DDL),用于定义和管理对象,例如数据库.数据表以及试图等.例如create.drop.alter等语句. 2. 数据操作语言(DML),用于操作数据库中数据,例如select. insert

搞定linux上MySQL编程(三):MySQL高级语法

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 本节介绍Mysql高级语法,包括试图.存储过程.索引等,通过使用试图.触发器等来优化数据库设计和查询技术,提高数据处理能力与效率. 视图操作: 视图是一个虚拟表,内容由查询定义.视图并不在数据库中以存储的数据值集形式存在,行和列数据来源于定义视图的查询所引用的表,且在引用试图时动态生成.从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作的哦可以应用于视图,例如

搞定linux上MySQL编程(一):linux上源码安装MySQL

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 1. 首先下载源码包: ftp://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.1/mysql-5.1.72.tar.gz 2. 使用如下命令检查系统中是否已安装mysql: rpm -qa | grep mysql 3.没有安装则解压安装包然后进入该目录: cd mysql 分别依次执行如下操作: ./configure --pr

搞定linux上MySQL编程(五):数据导入导出和备份

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 在MySQL中提供多种数据导入方法,比如mysqlinport.sql语句导入以及编写专门导入程序等.通常情况下,数据导入基本步骤科分成3步: 1. 确定导入的数据源,按固定格式存储的文本文件或者SQL文件. 2. 依照导入的文件格式,确定目标数据表,这个数据表如果没有,可以依照导入的文本文件格式,创建一个相对应的数据表. 3. 执行导入命令,将数据导入数据表中. 下面分别介

linux上源码安装MySQL详解

最近需要使用MySQL Fabric,这货是MySQL5.6.10之后才出现的utility.手头机器装的是MySQL5.1,所以需要先把旧版MySQL升级成5.6版本.之前没有玩过MySQL,所以这次稍微费了点事.在此,把过程记录下来,希望能给有需求的人提供一点帮助.下面我们就正式开始. 1. 删除老版本MySQL 其实删除老版MySQL是一件很简单的事,但是开始时候由于担心各个包的依赖会导致各种问题,亦步亦趋来得很慢.其实只需要做到这么几步就可以了: 1.1 查看已安装的mysql版本并删除

MySQL 数据库用户和权限管理

MySQL 数据库用户和权限管理 技能目标 掌握MySQL 用户管理 添加管理用户 修改密码及忘记密码修改 用户授权 数据库是信息系统中非常重要的环节,合理高效的对它进行管理是很重要的工作.通常是由拥有最高权限的管理员创建不同的管理账户,然后分配不同的操作权限,把这些账户交给相应的管理人员使用 用户管理 1: 新建用户 新建用户的命令格式如下 CREATE USER 'username'@'host' [IDENTIFIED BY [PASSWORD]'password'] #大写是固定格式大括

Linux 上SSH 服务的配置和管理

基本上Linux的网络服务器在远程操作大多时候都是使用SSH来配置.管理服务器.现在我们就来分享一下简单配置Linux的SSH服务. 1.检查一下默认安装的系统是否安装了SSH服务: chkconfig  --list | grep sshd 2.首先要备份配置文件,任何时候我们需要修改配置文件的时候都建议先把原始文件备份 cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 3.下面我们就来修改SSHD_config配置文件,需要修改两个地方,

Linux分类笔记(一)-权限管理

Linux分类笔记(一) 权限管理 普通权限 文件的普通权限 对一个普通的文件使用ls -ll命令后,看到下面的输出内容   而对于文件权限中的每一位,又分别代表了以下的意思 文件类型又有以下几类: [d]:目录 [-]:文件 [l]:连接文件 [b]:可供存储的接口设备 [c]:串行端口设备,如键盘和鼠标 权限的定义: r:可读,普通文件的r代表可以读取该文件的实际内容:目录的r代表可以读取该目录结构列表的权限 w:可写,普通文件的w代表可以编辑,新增或者修改文件内容,但不能删除该文件:目录的