Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL权限开通的设计方案

MySQL权限开通的设计方案

作者头像
jeanron100
发布于 2018-07-26 07:06:50
发布于 2018-07-26 07:06:50
9500
举报

MySQL中的权限管理和其他数据库还是有很大的不同,它能够实现几种很特别的权限场景:

  1. 几个人公用一个账号,看起来用户名相同,密码相同,但是权限缺可以不同
  2. 几个人用同一个账号,用户名相同,但是密码可以不同,权限可以相同
  3. 几个人用同一个账号,用户名相同,但是密码可以不同,权限可以不同。

主要的原因就在于MySQL的权限认证中是按照用户和主机名两个维度结合来考量的。

所以我们的工作中,如果权限指定的太细,到了IP级别,其实需要创建的用户太多,所以我们很多时候是基于一个网段来创建,比如用户IP是192.168.3.100,那么我们可能会创建192.168.3.%的用户,这样后续要开通权限就能方便很多,从权限的管理来说,可能需要补充的就是系统级别的防火墙权限了。

这个看起来蛮简单的工作,一旦陷入琐碎的设置和流程之中,就会给我们带来很多的困扰和手工操作的复杂度,大体有几类体验比较深的痛点:

  1. 开通权限需要手工构造很多基本的SQL语句,看起来没有技术含量
  2. 如果指定一些表名,比如指定10个表,开通权限的时候可能权限语句就需要10条。
  3. 如果有多个IP要开通权限,那么我们需要手工构造很多重复繁琐的权限语句
  4. 每次开通权限的时候,对于密码都是一个头疼的格式,密码太简单不好,输入的多一些,手工输入的时候其实会发现密码好像不够随机。
  5. 测试环境和生产环境的用户应该按照规范,现在可能就压根没有遵守规范。

所以实际接触一些场景,自己手工做了一些业务之后,我发现这个地方确实得改进一下了。

整体的思路就是根据输入的信息自动生成匹配的SQL语句,人工初步审核和过滤,确认后执行。如果梳理需求,大体就会有一些功能点需要完善,这些通过手工眼里去鉴别还是有些费神的。整体来说是有两个大的功能需要做,一个是开通权限,一个是查询权限。

开通权限的部分需要的改进如下:

1. 根据客户端IP信息,取IP的前三段动态生成用户

2. 根据输入对象动态生成SQL

3. 根据输入权限动态生成SQL

4. 根据环境类型,检查用户名是否符合规范,根据业务匹配用户名

5. 根据权限类型,检查用户名是否符合规范

6. 帮助生成随机密码,转储密码信息到数据库中

7. 输入参数保证健壮性,自动过滤空格

查询权限的部分需要的改进如下:

1. 根据客户端IP和端口在服务器中得到权限信息列表

2. 根据用户来查找相应的权限

进一步发掘需求,其实我们需要的基本信息是下面的几个参数:

环境类型: 测试开发环境,线上环境

用户名:

密码:

权限类型:

数据库:

对象:

客户端列表:

def handle_grant():

# client IP list

ipaddr_list = '192.168.10.202,192.168.10.203, 192.168.3.20'

# username

username ='dev_user'

password = ''.join(random.sample(string.ascii_letters + string.digits, 15))

privilege_list = 'select,insert,delete'

database_list = 'test1,test2'

object_list = 'tab1,tab2,tab3'

env_type = 'test'

error_info = []

if env_type == 'test':

if username.startswith("dev_") == 0 :

error_info.append("username is not following standard...")

print(error_info)

return;

elif env_type == 'prod':

if username.startswith("prod") == 0:

error_info.append("username is not following standard...")

print(error_info)

return;

print("aaa")

ipaddr_list = ipaddr_list.replace(' ', '')

print(ipaddr_list)

username_list = []

for ipaddr in ipaddr_list.split(','):

tmp_ipaddr = '.'.join(ipaddr.split('.')[0:3])

if tmp_ipaddr not in username_list:

username_list.append(tmp_ipaddr)

print(username_list)

create_user_SQLs = []

for host_prefix in username_list:

create_user_SQLs.append( 'create user ' +username+ '@'+"'"+host_prefix+".%' identified by '"+password+"';")

for sql in create_user_SQLs:

print(sql)

grant_SQLs = []

for owner_db in database_list.split(','):

for obj in object_list.split(','):

for user_host in username_list:

grant_SQLs.append("grant "+privilege_list+" on "+owner_db+"."+obj+" to "+username+"@'"+user_host+".%';")

print(grant_SQLs)

for sql in grant_SQLs:

print(sql)

handle_grant()

输出如下:

192.168.10.202,192.168.10.203,192.168.3.20

['192.168.10', '192.168.3']

create user dev_user@'192.168.10.%' identified by 'sRBgTNIei0XdUYZ';

create user dev_user@'192.168.3.%' identified by 'sRBgTNIei0XdUYZ';

。。。。。

grant select,insert,delete on test2.tab3 to dev_user@'192.168.10.%';

grant select,insert,delete on test2.tab3 to dev_user@'192.168.3.%';

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
闭包函数和装饰器
闭包:闭是封闭(函数内部嵌套函数),包是包含,闭包是指该内部函数对外部作用域而非全局作用域的变量的引用。
GH
2022/05/10
4100
Centos下DNS+NamedManager高可用部署方案完整记录
之前说到了NamedManager单机版的配置,下面说下DNS+NamedManager双机高可用的配置方案:
洗尽了浮华
2018/08/01
4.1K0
Centos下DNS+NamedManager高可用部署方案完整记录
MySQL远程连接拒绝访问?ERROR 1410 (42000): You are not allowed to create a user with G一招修改root权限解决(适用MySQL 8)
使用 IntelliJ IDEA 或其他客户端连接 openEuler MySQL 服务器时报错:
猫头虎
2025/06/14
3620
MySQL权限管理的一些自助化服务思路
今天在帮一位开发同学处理一个权限问题的时候,无意中想起来在2年前一位DBA同事的抱怨,问题的大概背景是:有一位开发同学发来了一些IP,让DBA帮忙看看这些IP有没有权限访问数据库,当时这位同事有些无奈,因为常理来看,要连哪个数据库应该是件很清晰确定的事情,而且就算防火墙没问题,最起码得知道是哪些用户,而这些对于业务同学来说,我们应该知道,连猜带蒙也应该知道。
jeanron100
2020/11/26
7920
(10) 如何MySQL读压力大的问题
读写分离时,需要注意,对于实时性要求比较高的数据,不适合在从库上查询(因为主从复制存在一定延迟(毫秒级)),比如库存就应该在主库上查询,如果放在从库上查询,可能会存在超卖的情况
用户1214487
2019/05/25
8710
Centos7 yum方式安装MySQL
1.下载安装源 wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.yum方式安装 yum -y install mysql57-community-release-el7-10.noarch.rpm 3.安装MySQL服务 yum -y install mysql-community-server 4.数据库具体配置 启动MySQL服务 systemctl start mysqld.servi
sunny1009
2020/06/19
7900
Centos7 yum方式安装MySQL
MySQL 总结
与其他 DBMS 一样,MySQL 有一个具体管理和处理数据的内部引擎。在你使用CREATE TABLE 语句时,该引擎具体创建表,而在你使用 SELECT 语句或进行其他数据库处理时,该引擎在内部处理你的请求。多数时候,此引擎都隐藏在 DBMS 内,不需要过多关注它。但 MySQL 与其他 DBMS 不一样,它具有多种引擎。它打包多个引擎,这些引擎都隐藏在MySQL服务器内,全都能执行 CREATE TABLE 和 SELECT 等命令。为什么要发行多种引擎呢?因为它们具有各自不同的功能和特性,为不同的任务选择正确的引擎能获得良好的功能和灵活性。
acc8226
2022/05/17
4380
MariaDB/MySQL用户和权限管理详解
MariaDB/MySQL中的user由用户名和主机名构成,如"root@localhost",同用户名但不同主机名对MySQL/MariaDB来讲是不同的,也就是说"root@localhost"和"root@127.0.0.1"是不同的用户,尽管它们都是本机的root。
星哥玩云
2022/08/16
1.8K0
MariaDB/MySQL用户和权限管理详解
MySQL 权限操作
  MySQL 权限系统保证所有的用户只执行允许做的事情。当连接 MySQL 服务器时,用户的身份由用户从那儿连接的主机和用户指定的用户名来决定。连接后发出请求后,系统根据用户的身份和用户想做什么来授予权限。MySQL 中采用用户名 + 主机名来识别用户的身份。例如,从 abc.com 连接的用户 root 不一定和从 bcd.com 连接的 root 是同一个人。MySQL 通过允许你区分在不同的主机上碰巧有同样名字的用户来处理它,可以对 root 从 abc.com 进行的连接授与一个权限集,而为 root 从 bcd.com 的连接授予一个不同的权限集。MySQL存取控制包含2个阶段:  ♞ 阶段1:服务器检查是否允许你连接。  ♞ 阶段2:假定能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。
Demo_Null
2020/09/28
3.2K0
MySQL 权限操作
入门MySQL——用户与权限
前面几篇文章为大家介绍了各种SQL语法的使用,本篇文章将主要介绍MySQL用户及权限相关知识,如果你不是DBA的话可能平时用的不多,但是了解下也是好处多多。
MySQL技术
2019/09/08
2.2K0
mysql之引擎、Explain、权限详解
引擎 简介 Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会
人生不如戏
2018/06/21
1.3K0
MySQL用户及权限管理?
对于这个话题,我相信对于一个技术人员来说,已经是不能再谈的话题了。说的简单通俗一点就是为了安全。
兔云小新LM
2019/08/06
3K0
mysql学习总结05 — 用户权限
mysql中所有用户信息保存在mysql数据库下的user表中。在安装mysql时,如果不创建匿名用户,那么默认用户只有root超级用户。mysql使用host(允许访问的IP或者主机地址)和user(用户名)共同组成主键来区分用户。如果host为%,表示所有用户(客户端)都可访问
CS逍遥剑仙
2025/05/18
2500
Mysql 常用命令
1、每条SQL命令必须以 ; 结尾 2、SQL命令不区分字母大小写 3、使用 \c 来终止当前命令的执行
零式的天空
2022/03/02
3850
mysql学习总结05 — 用户权限
mysql中所有用户信息保存在mysql数据库下的user表中。在安装mysql时,如果不创建匿名用户,那么默认用户只有root超级用户。mysql使用host(允许访问的IP或者主机地址)和user(用户名)共同组成主键来区分用户。如果host为%,表示所有用户(客户端)都可访问
CS逍遥剑仙
2018/06/24
1.5K0
mysql学习总结05 — 用户权限
【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限
MySQL 是一个强大的关系型数据库管理系统,提供了丰富的功能和选项来管理数据库和用户。数据库管理员(DBA)通常使用数据控制语言(Data Control Language,简称 DCL)来管理用户的权限和访问。
繁依Fanyi
2023/10/12
4670
【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限
MySQL 用户管理
注意:因为用户密码修改就是对mysql库中user表的数据修改, 所以得先确定当前登录用户是否有对mysql库的修改权限...
技能锦囊
2020/04/15
2.5K0
mysql操作命令梳理(4)-grant授权和revoke回收权限
在mysql维护工作中,做好权限管理是一个很重要的环节。下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke; grant授权格式:grant 权限列表 on 库.表 to 用户名@'ip' identified by "密码"; revoke回收权限格式:revoke 权限列表 on 库.表 from 用户名@'ip'; 下面通过一些例子说明: 1.grant授权 1)grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。 mysql>
洗尽了浮华
2018/01/22
2.9K0
Mysql 权限 &修改密码 & 忘记密码 & 远程登录
去除Mysql.ini 中[mysqlid] 下追加的 skip-grant-tables
收心
2022/01/19
6.4K0
Mysql 权限 &修改密码 & 忘记密码 & 远程登录
Ubuntu20.04安装Mysql
在Ubuntu中,默认情况下,只有最新版本的MySQL包含在APT软件包存储库中,要安装它,只需更新服务器上的包索引并安装默认包apt-get。 如果因为程序兼容性问题,要安装5.7版本,则可以同过下载安装。
全栈程序员站长
2022/09/15
2.6K0
Ubuntu20.04安装Mysql
相关推荐
闭包函数和装饰器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档