前言
权限,是解决“删库跑路”的可能性,接着来学习mysql权限的问题。
mysql角色问题,在5.7之上才有 like role的角色,当时我通过yum mysql安装的版本是 5.6,导致我迷惑了很久很久, 以为自己是角色配错了,没有生效......
查看版本的命令: mysql -uroot -proot
1.linux安装mysql 单实例安装
https://blog.csdn.net/qq_20409407/article/details/86369185
2.linux安装mysql 多实例安装
按照之前的两篇mysql搭建,安装的正是mysql5.7的版本:
正文
版本安装无误后,接下来测试权限的全过程
首先登陆root用户,执行下面的语句,
#语句解释:创建了一个dev的用户,密码为123, 'dev'@'%' 代表在全网段访问,如仅仅运行在网段为192.168.0.*的网段进行查询操作,应改为:'dev'@'192.168.244.%'
#dev 用户拥有mall这个数据库的查询权限
grant SELECT on mall.* TO 'dev'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
查看该用户的权限,可以看到dev仅仅只有查询的权限
show grants for 'dev'@'%'
用户标识:dev+ip是一个用户标识,可以为这一个赋予一个独特的权限
用户权限相关的表:
mysql.user,mysql.db,mysql.table_priv,mysql_column_priv
那这些表有什么用,和权限又有什么关系呢?
- User的一行记录代表一个用户标识
- db的一行记录代表对数据库的权限
- table_priv的一行记录代表对表的权限
- column_priv的一行记录代表对某一列的权限
在mall下面,新建一个表,并插入一些数据:
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`balance` int(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_balance` (`balance`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'lilei', '900');
INSERT INTO `account` VALUES ('2', 'hanmei', '100');
INSERT INTO `account` VALUES ('3', 'lucy', '250');
INSERT INTO `account` VALUES ('5', 'tom', '0');
列权限的控制:
#将 account表中的 id name两个字段的权限,赋权给 'dev'@'%'
grant select(id,name) on mall.account to 'dev'@'%';
此时,你肯定跟我一样,心急的去登入了dev用户,发现account整个表的数据,都能看到,为什么么?
原因就是: 通过 show grants for 'dev'@'%' 查看一下权限,你会发现一个更大的权限出现在这
解决方式:收回这mall.*这个权限即可
#收回dev@'%' 用户的 mall.* 的权限 REVOKE SELECT on mall.* from 'dev'@'%'
收回权限后,看看是不是只能通过sql查询赋权的字段了?是不是豁然开朗呢?
Mysql的角色
在mysql5.7开始才正式支持这个功能,而且连mysql官方把它叫做“Role Like”(不是角色,长得比较像而已)。
吐露一下自己的心声:之前我一直用5.6,一直试,一直试,都没成功,还以为自己哪里弄错了.....真正的血泪史,希望大家早点发现是版本问题,不要像我自以为是的瞎捣鼓。
show variables like "%proxy%"
想玩5.7中的Role like,先要要将 check_proxy_users,mysql_native_password_proxy_users 变为true才行,当然,你也可以把这两个配置设置到my.cnf中
set GLOBAL check_proxy_users =1; set GLOBAL mysql_native_password_proxy_users = 1;
前期准备做好了,我们来创建一个角色,2个开发者账号,并把“2个开发者账号”add到“dev_role”中
创建一个角色???【别一头雾水,角色就是用户,要不然mysql官方也不会称之为“Role Like”】
create USER 'dev_role'
创建两个开发者账号
create USER 'hqf1'; create USER 'hqf2';
把两个用户加到组里面
grant proxy on 'dev_role' to 'hqf1'; grant proxy on 'dev_role' to 'hqf2';
居然报错了,赶快查一下什么原因
这里有个小的地方需要注意:如果你是远程链接,你可能会收获一个大大的错误,你没有权限做这一步,这个时候你需要再服务器上执行一条下面一条语句
GRANT PROXY ON ''@'' TO 'root'@'%' WITH GRANT OPTION; #执行完后,再执行下面的语句,应该没什么问题了 grant proxy on 'dev_role' to 'hqf1'; grant proxy on 'dev_role' to 'hqf2';
查看其中一个用户的权限,通过下面的图片,可以看到原来就是 将以前的ip@‘%’ 换成了 'dev_role'@'%',真有点意思
GRANT PROXY ON 'dev_role'@'%' TO 'hqf1'@'%'
show GRANTS for 'hqf1'; show GRANTS for 'hqf2';
给角色dev_role应该有的权限
有了用户了,这用户也归属到了dev_role这角色下面,那接下来要做的就很简单了,根据业务需求给这角色设置权限就好了
grant select(id,name) on mall.account to 'dev_role'
测试这hqf1 hqf2 dev_role 这三个权限是不是已经ok了呢?
忘记说了,这三个用户登录都没有设置密码的,自己测试下吧,我测试了下,完全ok了
select id ,name from mall.account
select * from mall.account;
总结:mysql角色 权限问题,大致知道了,原来是通过 用户 控制 用户 来着