六、Mysql - 用户管理 - 权限(二)
目录
知识点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语句
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
查看给wangsh用户授予的权限语句
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)
#############################################################
知识点2:权限的分类
按照权限的授予级别,可以分成以下几类
全局权限
全局权限 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 只能对某个列进行操作、
#############################################################
知识点3:权限检查顺序
使用skip-grant-tables语句破解root用户密码跳过的授权表格就是这些表格。
#############################################################
知识点4:废除权限
给予某个用户很大的权利,如何将权利回收?
语法格式:
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权限
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通