用户管理
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。
用户
用户信息
MySQL中的用户,都存储于MySQL系统数据库 ‘mysql’ 的 ‘user’ 表中,user,本质上也是一张表,我们也可以利用CURD操作对其进行操作:
看一看user表中的属性信息:
其中User和Host字段作为user表的复合主键;
为此,我们想要准确定位user表中一个用户的信息的话,我们只需要告诉user表,我们要查询的用户的用户名和Host;
我们接着来看看,user表中当前用户信息:
由于user表中的字段太多了,我们就挑几个关键字段看一看:
User: 就表示用户名,其中mysql.sys和mysql.session用户已经被锁定,无法进行客户端登录;root账号进行用户管理;
Host: ip字段,该字段表示规定了客户端的登录方式,localhost或’127.0.0.1’表示该用户只能从本地登录;'%'表示改用户可以从任意ip登录;‘特定ip’:表示用户只能从该ip地址的主机登录;
一般情况下,我们的MySQL服务是不会暴露在公网上的,因为不安全,有可能遭受黑客攻击,因此我们的MySQL中的用户一般只允许本地登录,如果实在要进行远程登录,那么也必须限制为特定ip登录;
authentication_string: 用户密码通过password函数加密后的数据
*_priv: 用户拥有的权限
创建用户
本质上user也是一张表,我们使用CURD操作也是可以添加用户的,但是我们通过查阅user表结构就知道,user表有太多属性了,如果我们使用insert的话,那么我们的手都得写麻;
为此,如果想要新增一个用户的话,我们可以使用一下语句:
语法:
create user '用户名' @ 'host' identified by '密码';
eg:
创建一个:'cxk’用户,允许其从任意ip登录:
create user 'cxk' @ '%' identified by 'cxk123456' ;
其中:使用create user语句创建出来的用户是没有任何权限的,只能通过我们后面的DCL语句来进行赋权;
这样我们就创建出来了一个新用户,这样的话,我们就能在远程进行登录了:
如果我们觉得让’cxk’用户进行远程登录比较危险的话,我们可以将‘cxk’用户的登录方式改为’localhost’或者’127.0.0.1’限制其本地登录:
我们直接使用update语句就可以了:
update user set Host='127.0.0.1' where User<=> 'cxk';
为了谨防设置未生效,我们可以使用flush privileges;
将更新结果刷新一下;
我们可以看到,但是给我们再次进行远程登录的时候就报错了;
我们再来接着试一试本地登录:
删除用户
同理,这里我们也可以利用CURD操作,我们就不说了
我们使用另一个语法:
drop user '用户名'@'host';
eg:
我们现在要删除cxk用户
drop user 'cxk'@'127.0.0.1';
修改用户密码
语法:
set password=password('密码');
//修改当前用户自己的密码
语法:
set password for 'user'@'host' =password('密码');
//root用户修改指定用户的密码
为了方便测试,我们还是将’cxk’用户请回来:
create user 'cxk'@'localhost' identified by 'cxk123456';
以cxk用户的身份登录mysqld服务器:
cxk用户修改自己的密码:
当然作为管理者root也是可以修改他所管理的成员的密码信息的:
set password for 'cxk'@'localhost'=password('cxk123456');
数据库权限
MySQL数据库提供的权限列表:
给用户搜权
我们知道,我们使用create user语句创建出来的用户是没有任何权限的,没有任何权限也就意味着该用户干不了任何事情,这肯定不是我们想要的,为此我们需要给用户一定的权限,在MySQL中于权限相关的语句叫做DCL语句;
给用户授权:
grant 权限列表 on 数据库.表 to 'user' @'host' [identified by '密码'];
注意:
- 权限列表如果有多个,可以使用逗号隔开;
- 如果要给用户操作的当前数据库下的所有表,那么可以给在 ‘数据库.表’ 这里我们可以这样写:
'数据库.* ’- 如果我们像要给某个用户赋予所有权限,我们只需要
grant all on 数据库.表 to 'user'@'host';
- identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户;
eg:当前的cxk用户是没有任何权限的,因此他看不到任何数据库,除了系统那个公共数据库:
通过对比我们可以发现,cxk用户在没有任何权限的情况下,看到的数据库是极其有限的!
为此,我们可以使用grant语句来进行赋权:
我们该cxk用户赋予test数据库下的exam_result表的读权限:
grant select on test.exam_result to 'cxk'@'localhost';
现在,我们cxk用户想要删除exam_result表中的所有数据:
系统提示我们没有删除权限,我们可以给cxk用户赋予删除权限;
grant delete on test.exam_result to 'cxk'@'localhost';
在root身份下我们可以查看指定用户的权限信息:
语法:
show grants for 'user'@''host;
回收权限
语法:
revoke 权限列表 on 库.表 from 'cxk'@'host';
eg:
回收cxk的删除权限:
revoke delete on test.exam_result from 'cxk'@'localhost';