用户管理

点赞 👍👍收藏 🌟🌟关注 💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
目前为止我们使用mysql都是用的root账号,但是不建议直接使用root进行mysql的操作。我们推荐使用普通用户对数据的访问。而root作为管理员可以对普通用户对应的权限进行设置和管理。如给张三和李四这样的普通用户权限设定后。就只能操作给你权限的库了。

1.用户信息
MySQL有自己的用户管理,用户管理也是表结构形式进行管理的。 MySQL对用户做管理,其实是一定要记录下来那些用户是允许使用MySQL的,所以MySQLl的信息也是在MySQLl内特定的表中被保存的。这张表就是在系统数据库mysql的user表中。

可以简单看一下,
User 是用户名,
Host 代表允许这个用户从那台机器上登录mysql ,localhost代表只允许这个root从本地直接登录mysql。
后面一大堆都是权限信息,后面说。
authentication_string 是当前用户的密码
password_expried 是密码是否过期
password_last_changed是密码更改时间

这里我们主要查看下面三列
powershell
select user,host,authentication_string from user;

mysql和linux一样可以允许创建多个用户,这些用户都是普通用户,你可以给他们开账号,所谓在mysql内部给用户开账号,就是把用户的用户名,允许从哪里登录,以及用户的密码信息放在mysql中的user表里。然后就有了这个用户了。
如果我们现在想在mysql新建一个用户,有一个特点简单粗暴的方式,也不用后面学的专门的创建用户的sql语句。可以用inset 向这个user里面插入也是可以的。但是这太麻烦了。其实未来学的创建用户,删除用户,修改用户其实说到底就是在user表里做增加删除修改!
2.创建用户
语法:
powershell
create user '用户名'@'登陆主机/ip' identified by '密码';
用户名 ,自己随意设置
登陆主机/ip,不能少,如果是本机登录是 localhost/127.0.0.1,远程登录等会说
然后后面要设置密码,后面密码会被hash加密保存到user表中。
这里新建用户的行为其实就是向mysql的user表里插入一条信息

然后就可以进行本地登录了,不过最好在登录之前进行一下内存的刷新。刚才不是创建用户,这个用户信息是在内存当中的。我们对这个信息进行一下刷新,保证它是有效的就可以了。
powershell
flush privileges;
现在普通用户就可以登录了,输入的是刚才设置的密码。

备注:可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:
-- ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
可以参考这篇文章ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看密码设置相关要求
powershell
SHOW VARIABLES LIKE 'validate_password%';
注意上面新建的用户是不能够进行远程登录mysql的。那如何创建一个可以进行远程登录的用户呢?非常简单。
远程登录可以把允许从那台主机登录写成% ,因为我们目前用的都是windows下的IP地址,目前我们也就一台云服务器,公网ip设上也没有用。那有人说我把允许从那台主机上登录换成windows ip地址行不行呢?不行!windows下的ip地址是私有IP,在经过公网转发的时候会被NAT路由器替换。所以在这里设计具体IP地址没有任何意义。所以直接用 %,代表是允许wdl这个用户可以从任意主机处登录。 注意在数据库里,一般禁止直接带%。如果非得让他登录就必须明确限定出来这个用户允许从那台主机登录。
powershell
create user 'wdl'@'%' identified by '密码';

注意这里在mysql命令行上下翻的时候,涉及到密码的都不会被mysqk记录下来。
注意MySQL的端口号一定不能出现在公网上,MySQL的端口号以及整体服务是要在内网上被进行相关访问的。
3.删除用户
语法:
powershell
drop user '用户名'@'主机名'
注意直接给个用户名,不能删除,它默认是%,表示所有地方可以登陆的用户。必须要在删的时候清楚告诉mysql你删的这个人它是在哪台机器上的。相当于USER和HOST两列合起来才是一个用户,它必须得是完整的!

powershell
drop user wdl@localhost;
也可不带' '

4.修改用户密码
语法:
自己改自己密码
powershell
set password=password('新的密码');
root用户修改指定用户的密码
powershell
set password for '用户名'@'主机名'=password('新的密码');

甚至还可以用update更用户密码,所以不要被创建用户这些负责语句唬住了,它们的核心工作就是对这个user做增删查改。

5.数据库的权限
当我们在MySQL中把一个用户创建好了,不是就所有工作做好了,而是说把用户创建好了 ,用户还要有他对应的权限也要处理的。
MySQL数据库提供的权限列表:

当前新建的用户只能看到这一个数据库。

下面给新建用户授权,对新用户做相关限制。
5.1给用户授权
语法:
powershell
grant 权限列表 on 库.对象名 to '用户名'@'登陆位置' [identified by '密码']
库就是那个数据库,对象名就是那个表,说白了你这个权限是对哪一个数据库下的那一张表设置。
说明:
- 权限列表,多个权限用逗号分开
grant select on ...
grant select, delete, create on ...
grant all [privileges] on ... -- 表示赋予该用户在该对象上的所有权限
- *. * : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
- 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
- identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
首先root建立一个数据库,因为目前还没有给新用户授权所以当前看不到这个数据库

root创建一张表插入两条记录,然后新用户使用这张表的时候,报错的是权限拒绝,虽然从上帝视角看到是有这张表的,但是不让进去。一是不知道有这个数据库,二他也没有权限进去。

下面就给这个新用户这个权限
给了新用户权限后就可以看了,

查看给用户的权限都有哪些
powershell
show grants for 'wdl'@'%';
可以看到给当前用户的权限是所有的权限

所有新用户也是可以对表进行插入的

那我现在想把它插入权限去掉不让他插入,就可以去掉他对应的权限。
5.2回收权限
语法:
powershell
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
去掉用户的插入权限。去掉之后发现以前就一个all,怎么回收一个权限这里就变这么长了。但你会发现这里的权限少了insert。

我们发现当前用户是可以删除的,但是就是不能插入了!插入没有权限了。

同样也可以把删除权限去掉,用户也不可以删了

现在我们可以把用户所有权限都取消。发现用户不能查看这个user表了,甚至这个数据库都看不到了

这就是给用户赋权,给用户赋上对应的权限,用户就可以看到数据库以及数据库的表,如果取消了对应的权限,那对数据库表某些操作就不能做了,如果取消所有权限,那数据库以及表都看不到了。
给用户什么权限就只能做对应的对应的操作。
