[MYSQL用户]:03:普通用户的创建和删除操作及数据库访问授权
一:mysql数据库中用户表查看。(环境:阿里云centos7.4,虚拟机centos7.8)
1.需要以root用户登入,在mysql数据库中有一张mysql.user表是存储MySQL中所有用户的信息表,所以可以直接操作这个表的数据就可增加和删除用户; 修改完关键数据后,要执行刷新权限:flush privileges;
2.先use选定mysql这个数据库,在查看user这张表,下图是Navicat查看user表的一部分记录
2.1 mysql> show databases;
2.2 mysql> use mysql;
2.3 查看用户信息表:(user表的字段很多,下面只查看 用户、密码 及用户可以登录的位置简单查看)
mysql> select Host, User,Password from user;
2.4 mysql.user表中Host为%的含义
Host列指定了允许用户登录所使用的IP,比如user=root Host=192.168.1.1。这里的意思就是说root用户只能通过192.168.1.1的客户端去访问。
而%是个通配符,如果Host=192.168.1.%,那么就表示只要是IP地址前缀为“192.168.1.”的客户端都可以连接。
如果Host=%,表示所有IP都有连接权限。
这也就是为什么在开启远程连接的时候,大部分人都直接把Host改成%的缘故,为了省事。
二:mysql数据库添加用户(有两种形式):
1.只创建用户(也是以root权限操作)
1.1 语法:create user 用户名 identified by '密码';
mysql> create user yongheng0852 identified by '111111';
上面的命令创建了用户yongheng0852,密码是111111。在mysql.user表里可以查看到新增用户的信息:
mysql> select Host, User,Password from user;
1.2 此时 yongheng0852 这个用户未被授权访问数据库的权限,所以我们使用这个账号登录时,只能看到默认公开的一个数据库(information_schema),(后面111111是密码)
mysql -u yongheng0852 -p111111
mysql> show databases;
1.3 如何授权,我们先看看user用户表的结构,下图字段中以priv为后缀的都是权限操作:
注意:在表中,很多字段的类型都是 enum枚举类型的取值为:'N','Y' 默认为'N',这些就是设置权限的,只需要修改相应的属性为Y即可。
2.直接对mysql数据库的user表进行操作
mysql> insert into mysql.user(Host,User,Password) values(“localhost”,”yongheng0852”,password(“111111″));
mysql>flush privileges;
说明:这样就创建了一个名为:yongheng0852 密码为:111111(密码是经过加密的 ) 的用户,
不过这样没有权限因为只添加了三个字段(也可根据上面的表格,指定更多字段的权限),也可删除原有用户,再通过grant添 加权限,这里只举例,实际操作参见第三章节的说明。
mysql>grant all on *.* to [email protected] identified by ’111111″;
mysql>flush privileges;(刷新系统权限表)
3.删除用户 :删除用户yongheng0852。
3.1 只删除用户,保留权限授权信息:
mysql>delete from mysql.user where user ='yongheng0852’ ;
3.2 删除用户及相关的所以信息:
mysql> drop user [email protected]'%'; 删除登录方式为%的永恒0852的所有信息,假如有多个yongheng0852的用户信息,不能一次性删除,只能一条一条删除,必须指定登录方式才能删除(如果想用指令drop user yongheng0852,删除所有yongheng0852用户的信息,是不行的)。
3.3 两者区别
drop user 删除掉的用户不仅将user表中的数据删除,还会删除诸如db和其他权限表的内容。
而delete(方法1)只是删除了user表的内容,其他表不会被删除,后期如果命名一个和已删除用户相同的名字,权限就会被继承(yongheng0852这个用户,拥有对所有数据库的访问权限,那么我们通过delete方法删掉了yongheng0852这个用户,如果后面再创建一个yongheng0852用户,虽然没有为他分配权限,但是他也继承了,删除前yongheng0852对所有表格的操作权限)。
3.4 mysql>flush privileges; (刷新系统权限表,在这里无论是添加或是删除操作后必须来个flush privileges;这样才能起作用特别是删除用户后,如果未执行,被删除的用户还可登入,以上都是在MySQL root用户下操作
三.创建新用户并授权数据库访问权限的方式,(也是以root权限操作)
1. 语法:grant 权限 on 数据库对象 to 用户
1.1 MySQL 赋予用户权限命令的简单格式可概括为:
grant 权限 on 数据库.表 to 用户
grant 权限 on 数据库.表 to 用户 identified by "密码"
1.2 关键字说明:
权限:privileges 表示授予的权限类型,常用的有以下几种类型:(更多权限,请参考上面的user表设计结构)
a:数据操作:
→ all privileges:所有权限。
→ insert: 增加表的记录。
→ delete:删除权限。
→ update:更新权限。
→ select:读取权限。
→ create:创建权限。
→ drop:删除数据库、数据表权限。
→ index: 建立或删除索引。
b:全局管理MySQL用户权限:
→file: 在MySQL服务器上读写文件。
→ process : 显示或杀死属于其它用户的服务线程。
→ reload : 重载访问控制表,刷新日志等。
→ shutdown: 关闭MySQL服务。
c:特别的权限:
→ ALL: 允许做任何事(和root一样)。
→ USAGE: 只允许登录--其它什么也不允许做,使用create创建普通用户时的权限。
数据库.表:dbName.tableName表示授予权限的具体库或表,常用的有以下几种选项:
→ *.* :授予该数据库服务器所有数据库的权限。
→ dbName.*:授予dbName数据库所有表的权限。
→ dbName.dbTable:授予数据库dbName中dbTable表的权限。
用户和主机:[email protected]表示授予的用户以及允许该用户登录的IP地址。其中Host有以下几种类型:
→ localhost:只允许该用户在本地登录,不能远程登录。
→ %:允许在除本机之外的任何一台机器远程登录。
→ 192.168.1.10:具体的IP表示只允许该用户从特定IP登录。
2. 案例1:开放管理MySQL数据库中所有的权限
2.1 grant的简单使用说明 (冒号左边是指令,冒号右边是说明,使用+连接语句)
grant:授权 + all:表示所有权限(包括增 删 改 查等权限)+ *.*:点左边为数据库右边为表名 + to + yhtest:为添加的用户名 + @ + "%”为匹配的所有主机(所有主机都可以连接)+ identified by + yh123:为密码, (可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限)
2.2 功能1:增加yhtest用户,使用密码yh123登录,并且有所有数据库的所有权限。
mysql> grant all on *.* to [email protected]'%' identified by 'yh123' ;
flush privileges; (刷新系统权限表)
(执行完会在mysql.user表插入一条记录,1
查询用户表mysql> select Host, User,Password from user;
使用yhtest登录数据库
登录情况:成功
查看数据库信息:
在创建一个数据库:(确认有没有权限),创建数据库成功,删除成功,权限。
2.3 功能2: 增加yh999用户,该用户只能操作mysql数据库的所有表,拥有所有所有权限,只能在主机IP为192.168.0.10的电脑,使用密码yh123登录。
mysql> grant all privileges on mysql.* to [email protected]'192.168.0.10' identified by "yh123";
或
mysql> grant all on mysql.* to [email protected]'192.168.0.10' identified by "yh123";
(这里不做操作演示)
3. 案例2:开放管理MySQL中具体数据库的部分权限:
功能1:增加yh888用户,只能操作mysql数据库的user表,只有查询的权限(不能插入,更新,删除,及其他操作),在任何主机上登录,使用密码yh111登录
mysql> grant select on 数据库.表名 to 用户名@登录主机 identified by “密码”
mysql>grant select on mysql.user to [email protected]'%' identified by 'yh111';
确认用户:
测试:使用yh888 删除一条用户信息:yhtest。
登录:mysql -u yh888 -pyh111
查看数据库信息:mysql> show databases; 这个时候就只能看到mysql(第一个是默认都能看到的),
选择数据库:mysql> use mysql;
查询当前数据库有哪些表:mysql> show tables;
因为我们指定了,只能访问user表,所以只能看到这一张表,下面我们在意root用户查看mysql有多少张表:
查询用户信息:select Host, User,Password from user;
删除yhtest用户:delete from user where User ='yhtest';
错误信息,1142的错误代码就是没有权限:ERROR 1142 (42000): DELETE command denied to user 'yh888'@'localhost' for table 'user'
功能2:用户yh666可以访问所有数据库,只能执行增删改查操作(没有除此之外的其他操作),可以在任何主机登录使用密码yh222登录
mysql > grant select,insert,update,delete on 数据库.表名 to 用户名@登录主机 identified by “密码”
mysql > grant select,insert,update,delete on *.* to [email protected]"%”identified by “yh222″;
功能3:开放管理MySQL中具体数据库的表(testdb.table1)的部分列的权限
用户yh1010只能访问student数据库中person表,且只能对id、name、age 这三列进行查询操作(其他列无权限操作),可以在任何主机登录使用密码yh202登录
mysql > grant select(id, name, age) on students.person to [email protected]'%'identified by "yh202";
四:回收与查看权限
1.回收权限
revoke all on *.* from [email protected];
2.查看 MySQL 所以用户的权限
show grants;
3.查看 用户yongheng0852的权限
查看用户存不存在,mysql> select Host,User,Password from mysql.user;
查看权限 mysql> show grants for [email protected]%; (可以不加后面的%号)
USAGE :只能登陆,没有对数据的操作权限
五:总结
为了避免"删库跑路"的事情发生,为了MySQL的安全,应该给用户指定相应的权限,
用于all权限和%的用户是十分危险的,如果知道了用户的密码,那么他就可以在网上的任何一台电脑上登录你的MySQL数据库并对你的数据为所欲为了,
建议根据业务需要,指定用户访问指定的数据库和表,且限制登录位置,例如:yh用户,只有user表的那几列进行增删改查功能,且指定使用的ip。