Mysql用户权限控制(5.7以上版本)

1.1. 最简单的MySql权限  

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

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

使用Root用户,执行

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

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

再执行一条命令

show grants for ‘dev‘@‘192.168.244.%‘

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

1.2. 深入研究下MySQL权限

1.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)。

1.2.2. 用户权限所涉及的表

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

有几张表你可以好好的记记的,mysql.user,mysql.db,mysql.table_priv,mysql_column_priv

你可以熟悉其中的user表,甚至手动的改过里面的数据(不合规范哦!)

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

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

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

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

l 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表

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

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

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

这个就应该豁然开朗了吧

REVOKE SELECT on mall.* from ‘dev‘@‘192.168.244.%‘

你使用dev登陆查询试试

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

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

1.2.3. Mysql的角色

1.2.3.1.  准备工作

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

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

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

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

show variables like "%proxy%"

你得先把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中

1.2.3.2. 创建一个角色

create USER ‘dev_role‘

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

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

create USER ‘deer‘

create USER ‘enjoy‘

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

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

grant proxy on ‘dev_role‘ to  ‘deer‘

grant proxy on ‘dev_role‘ to  ‘enjoy‘

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

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

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

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

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

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

1.2.3.6. 测试

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

select id ,name from mall.account

你可能又会问,这种角色的权限是存哪的呢?

给你看表

原文地址:https://www.cnblogs.com/Soy-technology/p/11037481.html

时间: 2024-08-28 09:55:01

Mysql用户权限控制(5.7以上版本)的相关文章

MySQL用户权限导致的创建Trigger失败

说来惭愧,MySQL一直处于只会用,不怎么理解的阶段.甚至是一些较为深层次的管理,都不怎么熟悉,得加强啊! 近日,系统测试,使用MySQL数据库,需要在某个表上创建触发器,数据库是在本机安装.但是,无论如何都无法创建触发器,后台错误信息如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: TRIGGER command denied to user 'root'@'mortimer-PC' for table 't_user

mysq'l系列之10.mysql优化&权限控制

网站打开慢如何排查 1.打开网页, 用谷歌浏览器F12, 查看network: 哪个加载时间长就优化哪个 2.如果是数据库问题 2.1 查看大体情况 # top # uptime  //load average 负载 mysql> show full processlist; 2.2 查看慢查询日志: long_query_time = 1 log-slow-queries = /data/3306/slow.log 日志分析工具: mysqldumpslow  mysqlsla  myprof

mysql用户权限

mysql> show grants for [email protected]'localhost';+----------------------------------------------------------------------------------------------------------------------------------------+| Grants for [email protected] |+---------------------------

mysql用户权限管理

mysql数据在实际生产环境中大量被使用,那平时在做好服务器上防火墙策略以外平时,对mysql下的用户权限也要严格管理,mysql的用户权限都是放在mysql.user这张表里,平时的用户权限管理都是隐式使用着这张表的,先说下权限: 权限 意义 select 查询 insert 插入 update 更新 delete 删除记录,一般用于清空表或者某一条记录 create 创建 drop 删除,从表空间里删除 grant 授予,一般用于给用户授权 references 引用 index 索引 al

Mysql用户&权限管理

1.创建用户(相关表mysql.user) localhost root 本机 127.0.0.1  root 本机 ::1 root 本机 % cheng 远程用户(任意ip) 192.168.1.55 jake 远程用户(指定ip) 1).创建本地用户(只能在本机登陆本机数据库) create user 'cheng'@'localhost' identified by '123456';指定密码"123456". insert into mysql.user(Host,User,

2.4.3、Django用户权限控制

上面已经实现了登录和注销功能,但是还没起作用. 我们需要在每个视图函数里加上限制@login_required 如下: from django.contrib.auth.decorators import login_required ... ... @login_required def data_daka(request): all = class.objects.all() ... ... login_required实现了如下功能: 如果用户没有登录, 重定向到/accounts/log

MySQL用户权限详解

如果需要查看MySQL用户权限,应该如何实现呢?下面就为您介绍查看MySQL用户权限的方法,并对授予MySQL用户权限的语句进行介绍,供您参考. 查看MySQL用户权限: show grants for 你的用户 比如:show grants for [email protected]'localhost'; Grant 用法 GRANT USAGE ON *.* TO 'discuz'@'localhost' IDENTIFIED BY PASSWORD '*C242DDD213BE9C6F8

详解nginx、php-fpm和mysql用户权限

通常情况下,我们运行web应用的服务器有CentOS.Ubuntu.Debian等等的Linux发行版本.这时候,构成服务架构所必须的Nginx.php和MySQL等应用的权限控制就显得非常重要,各个服务对代码目录的权限要求各不相同,缺少某些权限会造成服务无法读写或运行的错误,降低了权限要求又会存在被入侵修改的隐患.这里我们就来总结一下nginx.php-fpm和mysql等等这些服务的权限划分. 一.web服务器Nginx权限 PHP的运行框架通常都是结合Nginx组成LNMP或者结合Apac

30.5. MySQL用户,权限,服务器配置,查询缓存及优化,索引等

MySQL用户和权限管理 元数据数据库:mysql系统授权表:db, host, usercolumns_priv, tables_priv, procs_priv, proxies_priv 用户账号:'USERNAME'@'HOST' @'HOST': 主机名 IP地址或Network可用通配符: % _示例:172.16.%.% 用户管理 创建用户:CREATE USERCREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password']:默认权