目录
知识点1:权限的传递
之前我们给wangsh用户添加了select和insert权限,但是wangsh用户是不可以新建数据库,表操作的,那么如何能给wangsh用户更大的权限呢?
- wangsh@(none) 14:59 mysql>create database test;
- ERROR 1044 (42000): Access denied for user 'wangsh'@'%' to database 'test'
示例:给予wangsh用户所有操作的权限
- root@(none) 14:56 mysql>grant all on *.* to 'wangsh'@'%' ;
- Query OK, 0 rows affected (0.00 sec)
然后让wangsh用户重新登录mysql服务,就能拥有这些权利了
- wangsh@(none) 15:10 mysql>show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | mysql |
- | performance_schema |
- | sanchuang |
- | student |
- | sys |
- | wangsh |
- +--------------------+
- 7 rows in set (0.01 sec)
-
- wangsh@(none) 15:10 mysql>create database t1;
- Query OK, 1 row affected (0.00 sec)
#############################################################
with grant option
通过在grant语句的最后使用该语句,就允许被授权的用户把得到的权限继续授予其他用户。
我们已经使用grant all 语句给wangsh用户授予了很大的权利,但是wangsh用户还是不是最大的权利,因为最大的权利者是root用户,一般只有root用户能给其他用户授权。
示例:查看用户有哪些权利,
所有用户都存放在user表里面
- root@mysql 15:20 mysql>select * from user\G;
- *************************** 5. row ***************************
- Host: %
- User: wangsh
- Select_priv: Y
- Insert_priv: Y
- Update_priv: Y
- Delete_priv: Y
- Create_priv: Y
- Drop_priv: Y
- Reload_priv: Y
- Shutdown_priv: Y
- Process_priv: Y
- File_priv: Y
- Grant_priv: N
- References_priv: Y
- Index_priv: Y
- Alter_priv: Y
- Show_db_priv: Y
- Super_priv: Y
- Create_tmp_table_priv: Y
- Lock_tables_priv: Y
- Execute_priv: Y
- Repl_slave_priv: Y
- Repl_client_priv: Y
- Create_view_priv: Y
- Show_view_priv: Y
- Create_routine_priv: Y
- Alter_routine_priv: Y
- Create_user_priv: Y
- Event_priv: Y
- Trigger_priv: Y
- Create_tablespace_priv: Y
- ssl_type:
- ssl_cipher:
- x509_issuer:
- x509_subject:
- max_questions: 0
- max_updates: 0
- max_connections: 0
- max_user_connections: 0
- plugin: mysql_native_password
- authentication_string: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
- password_expired: N
- password_last_changed: 2022-08-11 11:55:59
- password_lifetime: NULL
- account_locked: N
可以看到,wangsh用户只有grant权限没有,
我们可以使用with grant option语句来给wangsh用户授予grant权限
示例:给wangsh用户授予grant权限。
- root@mysql 15:23 mysql>grant all on *.* to 'wangsh'@'%' with grant option;
- Query OK, 0 rows affected (0.00 sec)
-
- root@mysql 15:25 mysql>
可以看到wangsh用户已经拥有了grant权限,已经和root用户平起平坐
- *************************** 5. row ***************************
- Host: %
- User: wangsh
- Select_priv: Y
- Insert_priv: Y
- Update_priv: Y
- Delete_priv: Y
- Create_priv: Y
- Drop_priv: Y
- Reload_priv: Y
- Shutdown_priv: Y
- Process_priv: Y
- File_priv: Y
- Grant_priv: Y
- References_priv: Y
- Index_priv: Y
- Alter_priv: Y
- Show_db_priv: Y
- Super_priv: Y
- Create_tmp_table_priv: Y
- Lock_tables_priv: Y
- Execute_priv: Y
- Repl_slave_priv: Y
- Repl_client_priv: Y
- Create_view_priv: Y
- Show_view_priv: Y
- Create_routine_priv: Y
- Alter_routine_priv: Y
- Create_user_priv: Y
- Event_priv: Y
- Trigger_priv: Y
- Create_tablespace_priv: Y
- ssl_type:
- ssl_cipher:
- x509_issuer:
- x509_subject:
- max_questions: 0
- max_updates: 0
- max_connections: 0
- max_user_connections: 0
- plugin: mysql_native_password
- authentication_string: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
- password_expired: N
- password_last_changed: 2022-08-11 11:55:59
- password_lifetime: NULL
- account_locked: N
- root@mysql 15:30 mysql>show grants for 'wangsh'@'%';
- +---------------------------------------------------------------+
- | Grants for wangsh@% |
- +---------------------------------------------------------------+
- | GRANT ALL PRIVILEGES ON *.* TO 'wangsh'@'%' WITH GRANT OPTION |
- | GRANT SELECT, INSERT ON `student`.* TO 'wangsh'@'%' |
- +---------------------------------------------------------------+
- 2 rows in set (0.00 sec)
-
- root@mysql 15:30 mysql>
使用grant语句创建一个新用户
- root@mysql 15:30 mysql>grant all on *.* to 'zhangj'@'%' identified by '123123';
- Query OK, 0 rows affected, 1 warning (0.00 sec)
创建用户成功,但是有一条警告信息,告诉我们使用grant创建用户将会被弃用,让我们使用creat user的方式来创建用户。
-
- root@mysql 15:36 mysql>show warnings;
- +---------+------+------------------------------------------------------------------------------------------------------------------------------------+
- | Level | Code | Message |
- +---------+------+------------------------------------------------------------------------------------------------------------------------------------+
- | Warning | 1287 | Using GRANT for creating new user is deprecated and will be removed in future release. Create new user with CREATE USER statement. |
- +---------+------+------------------------------------------------------------------------------------------------------------------------------------+
- 1 row in set (0.00 sec)
#############################################################
按照权限的授予级别,可以分成以下几类
全局权限 Global Privileges
它是管理权限,应用到服务器上面的所有数据库上面,要授予全局权限,使用 on *.* 的语法
Mysql把全局权限保存在mysql.user表里面
数据库权限 Database Privileges
应用到某个特定的数据库的所有对象上面,要授予数据库权限,使用 on db_name.*的语法,
Mysql 把数据库权限保存在mysql.db表里面
表权限Table Privileges
应用到某个特定的表的所有列上面,使用 on db_name.tbl_name 的语法,
Mysql把表权限保存在myslq.tables_priv表里面。
列权限 Column Privileges:
应用到某个特定表的单个列上面,要授予列权限,必须在权限名称后面跟小括号
其中写上列名
Mysql把列权限保存在mysql.columns_priv 表里面
mysql.user 全局权限,
mysql.db 只能操作某个数据库
mysql.table_priv 只能操作某个表
mysql.columns 只能对某个列进行操作、
#############################################################
使用skip-grant-tables语句破解root用户密码跳过的授权表格就是这些表格。
#############################################################
给予某个用户很大的权利,如何将权利回收?
语法格式:
- REVOKE
- priv_type [(column_list)]
- [, priv_type [(column_list)]] ...
- ON [object_type] priv_level
- FROM user [, user] ...
-
- REVOKE ALL [PRIVILEGES], GRANT OPTION
- FROM user [, user] ...
-
- REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
示例:先授予shiyaling用户所有权利,然后使用revoke语句废除他的所有权限
- root@mysql 16:03 mysql>grant all on *.* to 'shiyaling'@'%' with grant option;
- Query OK, 0 rows affected (0.00 sec)
-
- root@mysql 16:04 mysql>show grants for 'shiyaling'@'%';
- +------------------------------------------------------------------+
- | Grants for shiyaling@% |
- +------------------------------------------------------------------+
- | GRANT ALL PRIVILEGES ON *.* TO 'shiyaling'@'%' WITH GRANT OPTION |
- +------------------------------------------------------------------+
- 1 row in set (0.00 sec)
-
- root@mysql 16:05 mysql>revoke all on *.* from 'shiyaling'@'%' ;
- Query OK, 0 rows affected (0.00 sec)
- root@mysql 16:06 mysql>show grants for 'shiyaling'@'%';
- +---------------------------------------------------------+
- | Grants for shiyaling@% |
- +---------------------------------------------------------+
- | GRANT USAGE ON *.* TO 'shiyaling'@'%' WITH GRANT OPTION |
- +---------------------------------------------------------+
- 1 row in set (0.00 sec)
-
- root@mysql 16:06 mysql>
-
使用revoke语句废除权限后,用户就只剩 USAGE权限了,这个权限是指用户只能使用,是最基本的权限,默认新建用户都只有拥有USAGE权限