什么是Mysql权限
对于正式库只给一个增删改查的权限,或者只给一个查询权限。
使用Root用户,执行
grant SELECT on mysqldemo.* TO ‘dev’@‘115.199.113.%’ IDENTIFIED BY ‘123’ WITH GRANT OPTION;
表示创建了一个dev用户,密码是123,仅仅运行在网段为1115.199.113.*的网段进行查询操作。
显示只有查询权限,没有修改权限。
深入理解Mysql权限
用户标识是什么
在mysql中的权限不是单纯的赋予给用户的,而是赋予给“用户+ip的”
比如dev用户是否能登录,用什么密码登录,并且能够访问什么数据库都要加上ip,这样才算一个完整的用户标识,换句话说,‘dev’’@’115.204.68.%’和‘dev’@‘localhost’这3个完全不同的用户标识。
用户权限涉及的物理表
查看权限涉及的表:
Mysql.user,mysql.db,mysql.table_priv,mysql_column_priv等
1)User的一行记录代表一个用户标识
2)db的一行记录代表对数据库的权限
3)tables_priv的一行记录代表着对表的权限
4)column_priv的一行记录代表对某一列的权限
5)实战:
#新建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');
对于前面创建的dev用户,可以不让他访问balance,但是id和name列是可以访问的。
grant SELECT(id,name) on mysqldemo.account TO ‘dev’@‘115.204.68.%’ IDENTIFIED BY ‘123’ WITH GRANT OPTION;
分别查看table_priv,column_priv的表数据
REVOKE SELECT on mysqldemo.* from ‘dev’@‘115.204.68.%’;
查询所有是不允许的
而你查询id,name是可以的
Mysql的角色实战
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 中。
2、创建一个角色
3、创建2个开发人员账号
4、把俩个用户加到角色组里面
这里有个小的地方需要注意:如果你是远程链接,你可能会收获一个大大的错误,你没有权
限做这一步,这个时候你需要再服务器上执行一条
GRANT PROXY ON ‘’@’’ TO ‘root’@’%’ WITH GRANT OPTION;
5、给角色dev_role应有的权限
6、测试
以用户testA、testB登录查询!
1、查询所有数据
2、查询授权数据