天天看点

mysql权限

3.1.最简单的 MySql 权限

最简单也是最高效的,如果解决新手们删库跑路的问题其实也是很简单的,对于正式库只给 一个增删改查的权限,或者只给一个查询权限(是不是就解决了删库的可能性?)

以下内容如果看官是大牛,请稍安勿躁,我讲内容的方式是从简单到入门,从入门到进阶, 从进阶到实战,从实战到。。。(包你满意)

使用 Root 用户,执行

grant SELECT on mall.* TO 'dev'@'10.1.191.%' IDENTIFIED BY '123' WITH GRANT OPTION;

           

很简单的一句 sql,创建了一个 dev 的用户,密码为 123,仅仅运行在网段为 192.168.0.*的 网段进行查询操作。 再执行一条命令

show grants for 'dev'@'10.1.191.%'           
mysql权限

不错,可以链接,也可以执行 select,这个时候还想删库?做梦吧~

3.2.深入研究下 MySQL 权限

3.2.1. 用户标识是什么

上面一句简单的 SQL 堪称完美的解决了程序员新手的删库跑路的问题,高兴吧,你学到了新 姿势,但是如果想面试给面试管留下好映像,上面的知识好像还不够,有必要好好深入研究 下 MySql 的权限了。

这里有个小的知识点需要先具备,在 mysql 中的权限不是单纯的赋予给用户的,而是赋予给” 用户+IP”的

比如 dev 用户是否能登陆,用什么密码登陆,并且能访问什么数据库等都需要加上 IP,这样 才 算 一 个 完 整 的 用 户 标 识 , 换 句 话 说 'dev'@'192.168.0.168' 、 'dev'@'127.0.0.1' 与 'dev'@'localhost' 这 3 个是完全不同的用户标识(哪怕你本机的 ip 就是 192.168.0.168)。

3.2.2. 用户权限所涉及的表

有了用户标识的概念接下来就可以看权限涉及的表了,这也是面试的时候加分项哦。

有几张表你可以好好的记记的,mysql.user,mysql.db,mysql.table_priv,mysql_column_priv 你可以熟悉其中的 user 表,甚至手动的改过里面的数据(不合规范哦!)

那这些表有什么用,和权限又有什么关系呢?

 User 的一行记录代表一个用户标识

 db 的一行记录代表对数据库的权限

 table_priv 的一行记录代表对表的权限

 column_priv 的一行记录代表对某一列的权限

新建一个表 account

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');           

很诧异吧,mysql 其实权限并不事特别 low,权限的粒度甚至到了某一列上,举例来说,有 个表 account 表

mysql权限

对于前面创建的 dev 用户我不想让他访问 balance 列,但是 id 和 name 列是可以访问的,这样 的需求在工作中不是没有。

grant select(id,name) on mall.account to 'dev'@'10.1.191.%';           

这时候可以在分别看下 table_priv,column_priv 的数据

mysql权限
mysql权限

这个就应该豁然开朗了吧

撤销之前的权限

REVOKE SELECT on mall.* from 'dev'@'10.1.191.%'           

你使用 dev 登陆查询试试

mysql权限

你再要查询所有记录?不好意思不让查

而你查询 id,name 查询又是可以了。

mysql权限

3.2.3. Mysql 的角色

3.2.3.1. 准备工作

MySql 基于”用户+IP”的这种授权模式其实还是挺好用的,但如果你使用 Oracle、PostgreSQL、 SqlServer 你可能会发牢骚

这样对于每个用户都要赋权的方式是不是太麻烦了,如果我用户多呢?有没有角色或者用户 组这样的功能呢?

好吧,你搓中了 mysql 的软肋,很痛,在 mysql5.7 开始才正式支持这个功能,而且连 mysql 官方把它叫做“Role Like”(不是角色,长得比较像而已,额~~~)?

好咧,那在 5.7 中怎么玩这个不像角色的角色呢?

show variables like "%proxy%"           
mysql权限

你得先把 check_proxy_users,mysql_native_password_proxy_users 这两个变量设置成 true 才 行

set GLOBAL check_proxy_users =1;

set GLOBAL mysql_native_password_proxy_users = 1;           

当然,你也可以把这两个配置设置到 my.cnf 中

3.2.3.2. 创建一个角色

create USER 'dev_role';           

可能被你发现了,我这里创建得是个 user,为了稍微像角色一点点,我给这 user 取名叫 dev_role,而且为了方便也没用使用密码了。

3.2.3.3. 创建 2 个开发人员账号:

create USER 'deer';

create USER 'enjoy';           

这两个用户我也没设置密码

3.2.3.4. 把两个用户加到组里面

grant proxy on 'dev_role' to 'deer';

grant proxy on 'dev_role' to 'enjoy';           

可以看下其中一个用户的权限

mysql权限

这里有个小的地方需要注意:如果你是远程链接,你可能会收获一个大大的错误,你没有权 限做这一步,这个时候你需要再服务器上执行一条

GRANT PROXY ON ''@'' TO 'root'@'%' WITH GRANT OPTION;           

自Mysql 5.5以来新增proxy代理用户,表在proxies_priv中,查看root的host

grant proxy on ''@'' TO 'root'@'localhost' WITH GRANT OPTION;           

3.2.3.5. 给角色 dev_role 应该有的权限

有了用户了,这用户也归属到了 dev_role 这角色下面,那接下来要做的就很简单了,根据 业务需求给这角色设置权限就好了

grant select(id,name) on mall.account to 'dev_role';           

3.2.3.6. 测试

好咧,大功告成,现在使用'deer'用户登陆系统试试

select id ,name from mall.account           

学到了吧,涨到姿势了吧,你可能又会问,这种角色的权限是存哪的呢? 给你看表

mysql权限

继续阅读