一、背景
就在昨天,突然意识到自己写的开源项目代码中使用的是超级管理员root。ip地址、用户名、密码都在里面,这秒秒钟被人删库不是正常的嘛?虽然自己的库里没啥值钱的东西,但重新导入也是很烦人的。
自己也刚入职场将近1年,CRUD倒是写得挺多的,但是数据库其他的基本没咋接触过,只能自己摸索,在公司,给用户设置添加权限这些工作都是运维大佬安排的,我这小弟也没机会接触啊。
既然今天遇到了这个问题,就来跟我一起学一把,涨涨小知识~
二、创建用户
在你安装好数据库后,最先登录的账号就是root用户了,老大哥了,啥权限都有。
在公司开发中,不可能每个开发人员使用的都是超级账号,这要不爽,删库跑路也太容易了吧,进局子的机会也变多了不是,咱还是老老实实在外面呼吸新鲜空气。
咱们先来创建一个普通developer账号,争取早日让老板多换几辆豪车~
#创建mindwarning用户
CREATE user 'mindwarning'@'%' IDENTIFIED BY 'mindwarning';
注:如果以前创建过相同的user,需要先(1)删除它,再执行(2)刷新操作;
可能出现的错误代码:
SQL错误(1396):Operation CREATE USER failed for 'mindwarning'@'%'
(1)删除用户
DROP USER mindwarning;
(2)刷新权限
FLUSH PRIVILEGES;
通用语句:
CREATE user 'username'@'host' IDENTIFIED BY 'password';
username:创建账号的用户名;
host:允许访问的客户端(ip或者主机地址),%表示允许任意远程主机登陆;
password:该用户名的登录密码。
咱来创建一个牛批的账号:
create user niupi;
该牛批的账号,没有密码、不限IP地址,你说牛不牛~
三、修改用户密码
话说,既然我的ip地址及账号密码都让别人知道了,我也没慌,改个密码人家不就删不了库了,就是部署的线上项目得重新改下密码然后再重新部署一下而已嘛!我保证下次不会再犯错了,希望各位引以为戒。
通用语句:
set password for 'username'@'host' = ‘newPassword’;
如果修改的用户为当前登录mysql数据库的用户可以使用以下语句直接修改:
set password = 'newPassword';
改完密码后,浑身一身轻松啊!上次还遇到由于mysql8的密码机制不同于mysql5导致改不了密码,捣鼓了半天还没解决,这次倒是畅通无阻。
如果你也改不了用户的密码,可以移步到阿里云MySQL安装的文章中,里面有相应的解决方法。
四、删除用户
超级管理员最爽的就是可以随意删除别的账户,这是上班体验不到的快乐,哈哈!
通用语句:
drop user 'username'@'host';
注意:mysql库中的user表的User和Host字段具有唯一性,所以drop删除时,需要带上两个字段一起索引。
五、权限管理
曾经有一份真诚的爱情摆在我的面前,但是我没有珍惜。等到了失去的时候才后悔莫及,尘世间最痛苦的事莫过于此。如果上天可以给我一个机会再来一次的话,我会对你说三个字“我爱你”。如果非要把这份爱加上一个期限,我希望是一万年!
诶,你说如果我可以给我的QQ账号刷一万年的黄钻,偷菜会不会更快啊?
1、权限分类
数据权限
增删改查(select、update、delete、insert)
结构权限
创建、删除表(create、drop)
管理权限
创建用户、授予权限、撤销授权(create user、grant、revoke):通常只给管理员此权限
2、授予权限
#权限分配
GRANT SELECT,UPDATE,DELETE,INSERT,CREATE ON mindwarning.* TO 'mindwarning'@'%';
Look~我给mindwarning用户授予了SELECT,UPDATE,DELETE,INSERT,CREATE权限。
通用语句:
grant 权限列表 on 数据库.表名 to 用户 [with grant option];
权限列表:授权的权限,使用“,”分隔;all privileges表示全部权限
数据库.表名:整个数据库(.)、某个数据库(数据库名.*)、某个表(数据库名.表名)
一般的,老板可以命令主管做什么事,而主管也可以命令手下员工干什么活。那在数据库中怎么实现呢?
像上面的权限分配语句,‘mindwarning’@’%'账号此时被授予了某些权限,但是当它想给另一个账号授予某些权限的时候,就无能为力了。
一方面是它没有grant权限,另一方面即使它被授予了grant权限,由于root没有将权限传递给mindwarning(也就是mindwarning不是主管,就不能命令手下员工)。
那怎么才能传递权限呢?
with grant option
当root用户给某个账号授予权限的时候,可以在账号后面添加with grant option,这样就能传递权限了。
GRANT all privileges ON mindwarning.* TO 'user007'@'%' with grant option;
现在user007拥有了全部权限,且能够使用权限,代替root用户去授予其他账号权限,这应该很好理解的。
3、查看权限
SHOW GRANTS FOR 'mindwarning'@'%';
4、回收权限
revoke all privileges ON mindwarning.* TO 'user007'@'%';
因为’user007’@’%'有with grant option传递权限的能力,所以还需要执行一步才能完成权限的回收;
revoke grant option from 'user007'@'%';
通用语句:
revoke 权限列表/all privileges on 数据库/*.表名/* from 用户;
像我们删除用户后,需要执行刷新语句才能成功。现在执行权限回收则立马有效果,不需要刷新,被执行的用户就能感受到权限被回收的快感,哈哈!这不比贵妃娘娘失宠来的快得多?
5、刷新权限
刷新,将当前对用户的权限操作,进行一个刷新,将操作的具体内容同步到对应的表中。
#(1)
flush privileges;
#(2)
mysqladmin reload;
#(3)
mysqladmin flush-privileges;
注:
第(1)种需要以管理员身份登录才能执行;
如果我们用上面不是管理员的mindwarning账号执行flush privileges;就会出现一下错误:
/* SQL错误(1227):Access denied; you need (at least one of) the RELOAD privilege(s) for this operation */
第(2)、(3)种则需要在操作系统环境下(cmd)运行,在操作工具上运行是会报错的:
/* SQL错误(1064):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqladmin reload' at line 1 */
/* SQL错误(1064):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysqladmin flush-privileges' at line 1 */
在操作系统环境下就不会报错!
注:能力有限,还请谅解,争取早日能够写出有质量的文章!
我是皮蛋布丁,一位爱吃皮蛋的热爱运动的废铁程序猿。