MySQL用户管理

文章目录

  • 前言
  • 一、MySQL用户管理
    • 1、用户
      • 用户信息
      • 创建用户
      • 删除用户
      • 修改用户密码
    • 2、数据库的权限
      • 给用户授权
      • 回收权限


前言


一、MySQL用户管理

我们前面学习MySQL数据库,一直都使用root用户来登录数据库并且进行操作。其实这样是存在安全隐患的,因为root用户是权限最高的用户,可以对所有数据库进行操作,这样数据库的安全性就会存在隐患,即如果不是自己登录了root用户,那么可以随便修改我们的数据库中的内容了。所以MySQL中就有了用户管理,通过对每个用户的权限进行设置,可以让不同的用户看到不同的数据库。

1、用户

用户信息

MySQL中的用户信息,都存储在系统数据库mysql的user表中。
我们看到user表中有很多个字段。
MySQL用户管理_第1张图片
我们可以通过下面的语句来查看user表中的这些列信息。其中host表示这个用户连接数据库时的IP地址,为localhost就表示这个用户只能本地连接,user为这个用户的名称,authentication_string为这个用户的密码,这个密码是经过password函数处理过的。

select host,user,authentication_string from user;

MySQL用户管理_第2张图片

创建用户

语法:

create user '用户名'@'登录主机/ip' identified by '密码';

下面我们来创建一个新用户。
当我们执行创建用户的语句后,如果出现下面的错误。这是因为前面我们为了可以免密登录MySQL,将MySQL设置了–skip-grant-tables启动选项。当使用这个选项启动MySQL服务器时,MySQL会忽略所有的用户认证信息,包括用户名、密码和权限。这意味着任何人都可以通过MySQL客户端连接到MySQL服务器,并以任何用户的身份执行任意操作。并且在这个选项下是不可以创建用户的,所以我们需要在MySQL的配置文件中将这一句再删除掉。但是如果我们将这个选项删除的话,那么需要重启mydqld,配置才能生效,而此时我们登录MySQL就需要输入密码了,所以在删除之前我们需要先将root用户的密码修改为自己知道的密码。修改root密码就是修改user表中user为root的用户的authentication_string列信息,所以我们可以使用update语句来进行修改。需要注意在–skip-grant-tables选项下,不能使用后面要讲的set语句来修改root用户密码,因为会执行失败。
MySQL用户管理_第3张图片
如果修改完root用户密码并且重新登录后,出现了下面的错误。这是因为我们设置的root用户的密码太简单了,所以触发了MySQL的密码策略。此时我们可以执行下面的两句set语句,第一句为将MySQL的密码策略改为弱级别,第二句为将MySQL的用户密码改为使用6位。详细可以看这篇文章
MySQL用户管理_第4张图片
然后我们执行下面的语句可以看到MySQL用户的密码相关的设置。
MySQL用户管理_第5张图片
然后我们就可以执行下面的语句来创建一个用户了。

create user 'drh'@'localhost' identified by 'xxxxxx';

如果我们创建用户后,但是查看user表时并没有新用户的数据,那么我们可以执行flush privileges来刷新数据。

flush privileges;

MySQL用户管理_第6张图片
然后我们使用drh登录数据库,可以看到drh用户看到的数据库没有root用户看到的数据库多。这其实是因为drh用户的权限不够。
MySQL用户管理_第7张图片
然后我们再通过远端登录drh用户,可以看到登录失败。这是因为drh用户的host位localhost,即只允许本地登录。
在这里插入图片描述

删除用户

语法:

drop user '用户名'@'主机名'

下面我们来将drh用户删除掉。我们需要指明要删除的用户和他所允许的IP地址。如果只指明用户,那么默认是%,表示所有地方可以登录的用户,而drh为只允许本地登录的用户,所以删除失败。
MySQL用户管理_第8张图片
下面我们再创建一个可以远端登录的用户。如果将用户的允许登录的IP设置为%,就表示这个用户可以在任何地方登录MySQL。

create user 'drh'@'%' identified by 'xxxxxx'

MySQL用户管理_第9张图片

修改用户密码

语法:
自己改自己密码

set password=password('新的密码');

root用户修改指定用户的密码

set password for '用户名'@'主机名'=password('新的密码')

下面我们通过root用户修改drh用户的密码。
MySQL用户管理_第10张图片
我们还可以通过update语句来修改用户密码。
MySQL用户管理_第11张图片

2、数据库的权限

MySQL数据库提供的权限列表:
MySQL用户管理_第12张图片

给用户授权

我们在上面刚创建的用户没有任何权限,所以新用户看到的数据库才很少。这时我们需要给用户授权。
语法:

grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']

说明:

  • 权限列表,多个权限用逗号分开。
grant select on ...
grant select, delete, create on ....
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
  • *. *:代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
  • 库.*:表示某个数据库中的所有数据对象(表,视图,存储过程等)
  • identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户。

我们先重新创建一个用户,可以看到zhangsan用户看到的数据库没有root用户看到的数据库多。
MySQL用户管理_第13张图片
下面我们使用root用户创建一个数据库,然后在这个数据库中创建一个表。我们看到zhangsan用户并不能进入到rootDB数据库中。
MySQL用户管理_第14张图片
下面我们通过root用户设置zhangsan用户访问rootDB数据库的权限。all表示给zhangsan用户所有的权限,rootDB.user表示给zhangsan用户的权限为rootDB数据库下的user表。

grant all on rootDB.user to 'zhangsan'@'localhost';

MySQL用户管理_第15张图片
我们可以通过下面的语句来查看root用户给某一个用户的权限。

show grants for 'zhangsan'@'localhost';

MySQL用户管理_第16张图片

回收权限

语法:

revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置'

下面我们回收zhangsan用户的insert权限,我们看到zhangsan用户就不能在user表中插入数据了。

revoke insert on rootDB.user from 'zhangsan'@'localhost';

MySQL用户管理_第17张图片
下面我们再删除zhangsan用户的所有权限,然后zhangsan用户就看不到数据库了。

revoke all on rootDB.user from 'zhangsan'@'localhost';

MySQL用户管理_第18张图片

下面我们给zhangsan用户只读权限,即select权限。然后我们看到zhangsan用户就只能查询rootDB数据库中的表信息,而不能修改rootDB数据库中表的数据等。
MySQL用户管理_第19张图片
然后我们将zhangsan用户的权限收回。然后我们看到在终端2中还是可以通过select语句读取rootDB数据库中的user表中的数据,这是因为终端2还在rootDB数据库中,所以还可以做权限内的事情,如果终端2换了数据库或者重新让zhangsan用户登录MySQL,那么就看不到rootDB数据库了。
MySQL用户管理_第20张图片

你可能感兴趣的:(MySQL,mysql,数据库,笔记)