用户与权限管理

1.用户管理

Mysql用户可分为普通用户root用户。root用户拥有所有的权限,包括创建用户,删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。

1.1登录MySQL服务器

在命令行中启动mysql的命名如下

mysql -h hostname|hostIP -P port -u username -p DatabaseName -e "SQL语句"

下面是其中参数的定义

  • -h参数 后面接 主机名或者主机IP地址,hostname为主机名,hostIP为主机IP
  • -P参数 后面接MySql的端口号,MySql默认的端口号为3306,不使用该参数时,自动连接到3306端口,port为连接的端口号
  • -u参数 后面接用户名,username为用户名
  • -p参数 会提示输入密码,不写好像直接就能连?
  • DatabaseName参数指明登录到哪一个数据库中,不写则直接登录进去,之后再用Use也行
  • -e参数 后面可以直接加SQL语句。登录MySql服务器以后即可执行此语句。然后会退出MySql服务器

举个例子

mysql -h 127.0.0.1[^hostIP] -P 3306[1] -u root[2] -p bookdb[3] -e “select * from t_user;”[4]

image-20221101194656855

当然了还有精简版的,都选用默认值

mysql -u root -p

image-20221101195723510

一样能进,进去后语句就和平常mysql的查询一样了

其实-u root什么的也能省,直接输mysql就能进,前提是设置了跳过安全检查

1.2 创建用户

创建用户的语句依旧是通过create创建的,但是需要先切到‘mysql’数据库,(叫这个名的一个数据库)

use mysql;
create user 'username' @'hostname' identified by 'pwd' ; 

这里直接创建的用户默认可访问的来源是%,也就是任意IP来源,只要叫这个username名就能访问,

所以创建时最好指定一下来源权限,identified by 后面的是这个用户的密码

需要注意的一点是host和user合起来作为联合主键,也就是说允许存在username相同hostname不同的两个用户


初始时系统默认的用户

image-20221101201155130

创建成功后的用户

image-20221101201933562


顺带一提,有些同学可能会出现下面的报错

image-20221101202105436

这是因为my.ini里面设置跳过安全检查了,注释了就行

#跳过安全检查
#skip-grant-tables

那我们现在连接上新创建好的用户

image-20221101202619925

成功连接!

但是……

image-20221101202642772

这里面只有一个数据库

再来查看权限

image-20221101202719822

发现也只有一个登录的权限,不过后续可以再赋给其权限

1.3 修改用户

修改用户的命令比较简单,和修改表的基本一致(其实改的就是个表)

update user set user='new username' where user='old username' and host='hostname';

那现在我们把之前的zhang3改成li4试试

image-20221101203508696

修改成功

但是问题来了,当我们尝试去登录li4的账户时,却无法登录

image-20221101203759815

这里有个要注意的点,此时MySql还没有反应过来用户名被修改,所以我们需要手动刷新一下

flush privileges;#刷新权限

image-20221101204004191

这时我们再去登录一下试试

image-20221101204031803

这次就成功了

1.4 删除用户

方法依旧和正常语法相似

DROP User username;

image-20221101204353492

成功删除

drop就不用刷新了

顺带一提,如果有多个同名用户,默认删的是host为%的用户,如果想删对应的记得加上@’hostname’


此外还有种方式可以删除

delete from mysql.user where host='hostname' and user='username'

同样能删,但是不推荐使用,因为通过这种方式,系统会有残留信息保存。drop则删除所有记录信息。

举个好理解的例子,drop user 相当于是卸载软件,delete from 的方式相当于删文件夹

1.5 设置当前用户密码

适用于root用户修改自己的密码,以及普通用户登录后修改自己的密码。

  1. 使用Alter User命令来修改当前用户密码

    Alter User User() Identified by 'new pwd';
    

    image-20221101205617640

  2. 使用SET语句来修改当前用户密码

    SET PASSWORD='new pwd';
    

    该语句会自动将密码加密后再赋给当前用户

    image-20221101210343593

1.6 修改其他用户密码

同样两种方式,就不过多解释了

  1. 使用Alter语句来修改其他普通用户密码

    alter user 'username'@'hostname' identified by 'new pwd';
    
  2. 使用SET命名来修改其他普通用户密码

    SET PASSWORD For 'username'@'hostname'='new pwd';
    

1.7 MySql密码管理

MySql中记录使用过的历史密码,目前包括如下密码管理功能

  1. 密码过期:要求定期修改密码。
  2. 密码重用限制:不允许使用旧密码。
  3. 密码强度评估:要求使用高强度密码。

1.密码过期策略

手动设置账号密码过期

Alter User 'username' PASSWORD EXPIRE;

该语句将该用户的密码设置为过期,该用户仍然可以正常登录进入数据库,但无法进行查询,只有重新设置了新密码,才能正常使用。

image-20221101211749878

全局设置密码过期

SET Persist defult_password_lifetime = 180;#建立全局策略,设置密码每隔180天过期

image-20221101212002338

单独设置密码过期

#在创建用户时设置每隔90天过期
create user 'username'@'hostname' PASSWORD Expire interval 90 DAY
#修改用户每隔90天过期
alter user 'username'@'hostname' PASSWORD Expire Interval 90 DAY;

#设置密码永不过期
alter user 'username'@'hostname' PASSWORD Expire Interval never;

#延用全局密码过期策略
alter user 'username'@'hostname' PASSWORD Expire Interval default;

2.密码重用策略

账号的历史密码包含过去所使用的密码。

  • 如果账号的密码限制基于密码更改的数量,那么新密码不能从最近限制的密码数量中选择。例如,密码更改的限制为3,那么新密码不能与最近3个密码中的任何一个相同
  • 如果账号的密码限制基于时间,那么新密码不能从规定时间内选择。例如,密码的重用时间为60,那么新密码不能从最近60天内使用过的密码中选择

password_history:规定密码重用的数量

password_reuse_interval:规定密码重用的周期

全局设置

Set Persist password_history = 3;#设置不能选择最近使用过的6个密码
Set Persist password_reuse_interval = 60;#设置不能从最近60天使用过的密码中选择

单独设置

#不能使用最近5个密码
Create User 'username'@'hostname' PASSWORD History 5;
Alter User 'username'@'hostname' PASSWORD History 5;

#不能使用最近365天内的密码
Create User 'username'@'hostname' PASSWORD Reuse Interval 365 DAY;
Alter User 'username'@'hostname' PASSWORD Reuse Interval 365 DAY;

#既不能用最近5个密码,也不能用365天内用过的密码
Create User 'username'@'hostname' 
PASSWORD History 5
PASSWORD Reuse Interval 365 DAY;

#延用全局策略
Create User 'username'@'hostname' 
PASSWORD History Default
PASSWORD Reuse Interval Default;

2. 权限管理

2.1 权限列表

show privileges;#查看MySql权限

image-20221101215125947

MySql的权限分布:

权限分布 可能的设置的权限
表权限 Select,Insert,Update,Delete,Create,Drop,Alter,References,Grant,Index
列权限 Select,Insert,Update,References
过程权限 Execute,Alter Routine,Grant

2.2 授予权限的原则

权限控制主要是出于安全因素,因此需要遵循以下几个经验原则

  1. 只授予能满足需要的最小权限,防止用户干坏事。比如用户只需要查询,那就只给select权限,不给update之类的权限
  2. 创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段(就比如在学校能查到学校信息,回家就查不到了,这是限制主机IP了)
  3. 为每个用户设置满足密码复杂度的密码
  4. 定期清理不需要的用户,回收权限或者删除用户

2.3 授予权限

授权命令:

Grant 权限1,权限2,…… ON 数据库名称.表名称 TO 'username'@'hostname' [Identified by pwd];

该权限如果发现没有该用户,则会直接新建一个用户


这里我们来给用户li4赋予一下权限,前面我们通过查看权限发现li4只有一个登录的权限,无法进行增删改查

image-20221102155823792

li4能查询到的数据库也只有系统默认数据库

image-20221102155958155

这是root权限下能查询到的数据库(不要在意内容)

image-20221102160101062

现在我们要把dp02数据库下所有表的增删改查权限赋给li4

grant select,update,delete,insert on dp02.* to 'li4';

image-20221102160427181

这时li4用户再查询数据库就有dp02了

image-20221102160514795

权限也有了

image-20221102160548451

使用数据库,然后查询表内容都没有问题

image-20221102160652885

此外,如果想把权限全部赋给一个用户,可以使用下面的语句

grant all privileges on *.* to 'username'@'hostname';

这样就把全部数据库全部权限赋给该用户了

那么问题来了,这时候该用户权限是否和root权限一样呢?

答案是否定的,此时虽然该用户获得了几乎所有权限,但还是有一点和root权限不同,就是该用户无法给别的用户赋予权限。就好比root权限是皇帝,该用户是太子,太子几乎拥有皇帝的一切权力,但是皇帝能去给自己孩子立太子,太子不能给自己兄弟立太子,毕竟自己也是被立上来的;同时皇帝也能废掉太子,皇子可不能废太子。

2.4 查看权限

SHOW GRANTS;#查看当前用户权限
SHOW GRANTS FOR 'username'@'hostname'#查看某用户全局权限

这里没什么好说的

2.5 收回权限

收回用户不必要的权限可以在一定程度上保证系统的安全性

注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。

#收回权限命令
REVOKE 权限1,权限2,…… ON 数据库名称.表名称 FROM 'username'@'hostname';

同样拿li4举例子,这里回收他的查询和更改命令

REVOKE select,update on dp02.* from 'li4';

image-20221102162649704

值得一提的是,收回权限要在目标用户重新登录后才能生效

重新登录以后,已经无法查询了

image-20221102162815354

insert语句还是能正常执行的

image-20221102162946143

如果想要删除该用户所有权限,仍然是all priviliges

revoke all privileges on *.* from 'username'@'hostname';

  1. 端口号,3306为MySql默认端口号 ↩︎

  2. 用户名,root为超级用户,拥有所有操作权限 ↩︎

  3. 数据库的名称,这里只是我其中的一个数据库,可以替换成自己的 ↩︎

  4. 一条sql查询语句,可以替换成任意的sql语句,比如”insert into 表名 values();” ↩︎

原文地址:http://www.cnblogs.com/xuanprogram/p/16851810.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性