MySQL修炼手册14:用户权限管理:安全保障与数据隔离
目录
- 写在开头
- 1 用户与权限的关系
- 1.1 用户的创建与删除
- 1.1.1 创建新用户
- 1.1.2 批量创建用户
- 1.1.3 安全删除用户
- 1.2 授予与撤销权限
- 1.2.1 授予权限
- 1.2.2 批量授予权限
- 1.2.3 撤销权限
- 2 角色的应用
- 2.1 创建与管理角色
- 2.1.1 创建角色
- 2.1.2 管理角色
- 2.2 将权限赋予角色
- 2.2.1 将权限赋予角色
- 2.2.2 用户与角色关联
- 2.3 示例演示
- 2.3.1 创建角色和分配权限
- 2.3.2 创建用户并关联角色
- 2.4 角色的优势与最佳实践
- 3 数据库层面的权限控制
- 3.1 数据库级权限管理
- 3.1.1 数据库创建与删除
- 3.1.2 数据库用户权限
- 3.1.3 安全性考虑与最佳实践
- 3.2 数据表级权限管理
- 3.2.1 数据表的创建与删除
- 3.2.2 数据表的权限设置
- 3.2.3 视图与权限
- 写在最后
写在开头
欢迎来到MySQL修炼手册的第14篇,本篇将深入探讨MySQL中用户权限管理的重要性以及如何通过合理的权限控制实现安全保障与数据隔离。在数据库管理中,用户权限的设置至关重要,不仅可以有效保护数据的安全,还能够合理分配数据访问权限,确保数据库的正常运作。让我们一起深入了解用户、权限、角色以及数据库层面的权限控制。
1 用户与权限的关系
在MySQL数据库中,用户与权限的关系是确保数据库安全性和数据隔离的关键。让我们详细展开用户的创建与删除,以及授予与撤销权限这两个重要方面。
1.1 用户的创建与删除
1.1.1 创建新用户
在MySQL中,创建新用户涉及到用户名、主机以及密码的设置。以下是一个详细的创建新用户的例子:
-- 创建新用户 'new_user',允许其从本地主机访问,并设置密码为 'password'
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';
这一步创建了一个名为 ‘new_user’ 的用户,@‘localhost’ 表示该用户只能从本地主机访问数据库。密码通过 IDENTIFIED BY 设置。密码的选择应考虑到安全性,可以使用强密码策略。
1.1.2 批量创建用户
在某些情况下,需要批量创建用户,可以使用 CREATE USER 语句的多值形式:
-- 批量创建用户,允许从不同主机访问
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password1','user2'@'%' IDENTIFIED BY 'password2','user3'@'192.168.1.1' IDENTIFIED BY 'password3';
上述例子中,通过逗号分隔,同时创建了三个用户,分别具有不同的访问主机和密码。
1.1.3 安全删除用户
当不再需要某个用户或者存在安全风险时,需要安全地删除用户。删除用户的步骤如下:
-- 删除用户 'user_to_delete',只能从本地主机访问
DROP USER 'user_to_delete'@'localhost';
在删除用户之前,确保该用户已经没有关键数据的访问需求,以免造成数据丢失或不必要的安全隐患。
1.2 授予与撤销权限
1.2.1 授予权限
一旦用户被创建,需要定义其对数据库的操作权限。以下是授予用户权限的一个例子:
-- 授予 'user' 从本地主机对 'database_name.table_name' 进行 SELECT 操作的权限
GRANT SELECT ON database_name.table_name TO 'user'@'localhost';
通过 GRANT 语句,可以精确控制用户对数据库、数据表的不同操作权限,确保用户只能进行其合法的操作。
1.2.2 批量授予权限
在某些情况下,需要批量为用户授予权限,可以使用 GRANT 语句的多值形式:
-- 批量授予 SELECT 和 INSERT 权限给多个用户
GRANT SELECT, INSERT ON database_name.table_name TO 'user1'@'localhost', 'user2'@'%';
上述例子中,同时为两个用户授予了对指定数据库表的不同权限。
1.2.3 撤销权限
在某些情况下,需要撤销用户的某些权限。使用 REVOKE 语句可以完成这一操作:
-- 撤销 'user' 从本地主机对 'database_name.table_name' 进行 SELECT 操作的权限
REVOKE SELECT ON database_name.table_name FROM 'user'@'localhost';
撤销权限是数据库安全管理中的关键操作,确保用户只有合理的权限,提高数据库的整体安全性。
2 角色的应用
在MySQL中,角色是一种灵活而有效的权限管理方式,能够简化用户权限的分配和管理。了解如何创建和使用角色对于数据库管理员来说至关重要。
2.1 创建与管理角色
2.1.1 创建角色
创建角色是一个关键步骤,通过以下SQL语句实现:
CREATE ROLE role_name;
在这里,role_name是你为角色指定的唯一标识符。创建角色后,你可以为其分配相应的权限。
2.1.2 管理角色
对角色的管理包括修改角色的权限、重命名角色或删除不再需要的角色。
修改角色权限
通过GRANT语句,你可以向角色授予特定的权限。例如,将SELECT权限授予角色:
GRANT SELECT ON database.table TO role_name;
可以指定的权限包括SELECT、INSERT、UPDATE、DELETE等,根据实际需求进行灵活控制。
重命名角色
如果需要修改角色的名称,可以使用RENAME语句:
RENAME ROLE old_name TO new_name;
这样可以保持系统中的角色标识符的一致性。
删除角色
当确定某个角色不再需要时,使用DROP语句删除角色:
DROP ROLE role_name;
这将移除角色及其权限,确保数据库的权限体系清晰有序。
2.2 将权限赋予角色
2.2.1 将权限赋予角色
创建角色后,下一步是将权限赋予这个角色。通过GRANT语句实现:
GRANT permission ON database.table TO role_name;
在这里,permission可以是SELECT、INSERT、UPDATE等,表示你希望赋予角色的具体操作权限。
2.2.2 用户与角色关联
为了使用户拥有某个角色的权限,需要将用户与角色进行关联。这可以通过GRANT语句完成:
GRANT role_name TO user_name;
这一步确保用户继承了角色的所有权限,实现了权限的集中管理。如果需要撤销角色,可以使用REVOKE语句。
2.3 示例演示
为了更好地理解角色的应用,我们通过一个简单的示例演示整个过程。
假设我们有一个数据库company,其中包含员工信息的表employees。我们希望创建一个角色hr_role,赋予它对employees表的SELECT和INSERT权限,并将这个角色关联给用户hr_user。
2.3.1 创建角色和分配权限
首先,创建角色hr_role:
CREATE ROLE hr_role;
接着,将SELECT和INSERT权限赋予hr_role:
GRANT SELECT, INSERT ON company.employees TO hr_role;
现在,hr_role拥有对company.employees表的读写权限。
2.3.2 创建用户并关联角色
创建用户hr_user:
CREATE USER 'hr_user'@'localhost' IDENTIFIED BY 'password';
将hr_role角色赋予用户hr_user:
GRANT hr_role TO 'hr_user'@'localhost';
现在,hr_user用户拥有了hr_role的所有权限,包括对company.employees表的SELECT和INSERT权限。
2.4 角色的优势与最佳实践
使用角色的优势在于简化权限管理、提高可维护性、减少冗余工作。最佳实践包括:
-
合理划分角色: 根据业务需求和权限粒度,合理划分角色,避免角色权限过于复杂。
-
定期审查和更新: 定期审查角色和权限,确保其与实际需求保持一致,并根据业务变化进行更新。
-
谨慎使用ADMIN权限: 避免滥用ADMIN权限,确保每个角色仅具有其工作需要的最低权限。
3 数据库层面的权限控制
数据库层面的权限控制涉及到对整个数据库以及其中的数据表进行精细化管理,确保数据库系统的安全性和数据隔离。在这一部分,我们将深入探讨数据库层面权限控制的各个方面。
3.1 数据库级权限管理
3.1.1 数据库创建与删除
数据库创建
在MySQL中,通过CREATE DATABASE语句可以创建新的数据库。然而,为了保证安全性,我们建议在创建数据库时指定一些重要参数,例如字符集、排序规则等。示例:
CREATE DATABASE my_databaseCHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;
数据库删除
删除数据库是一项敏感的操作,需要谨慎执行。使用DROP DATABASE语句可以删除数据库,但要确保在删除之前备份重要数据,并验证执行命令的用户具有足够权限。
DROP DATABASE my_database;
3.1.2 数据库用户权限
用户权限分配
通过GRANT语句,我们可以为用户分配数据库级别的权限。例如,授予用户对特定数据库的全部权限:
GRANT ALL PRIVILEGES ON my_database.* TO 'username'@'localhost';
用户权限收回
若需要收回用户的某些权限,可以使用REVOKE语句。例如,收回用户对数据库的写权限:
REVOKE INSERT, UPDATE, DELETE ON my_database.* FROM 'username'@'localhost';
3.1.3 安全性考虑与最佳实践
在设置数据库级权限时,需要考虑一系列安全性问题。以下是一些最佳实践:
- 使用强密码:确保用户密码足够复杂,防范未授权访问。
- 定期审查权限:定期检查用户权限,及时调整以适应系统变化。
- 限制远程访问:只允许必要的IP地址访问数据库,减少潜在风险。
3.2 数据表级权限管理
3.2.1 数据表的创建与删除
数据表创建
使用CREATE TABLE语句可以创建新的数据表。同时,为了增强安全性,可以定义表的各个字段的数据类型、约束等。
CREATE TABLE my_table (id INT PRIMARY KEY,name VARCHAR(50) NOT NULL
);
数据表删除
删除数据表可使用DROP TABLE语句,但务必在执行前确认操作无误,以免造成数据丢失。
DROP TABLE my_table;
3.2.2 数据表的权限设置
权限授予
通过GRANT语句,我们可以为用户分配对数据表的不同权限,例如SELECT、INSERT、UPDATE、DELETE等。
GRANT SELECT, INSERT ON my_database.my_table TO 'username'@'localhost';
权限收回
使用REVOKE语句可以撤销用户对数据表的某些权限。
REVOKE INSERT ON my_database.my_table FROM 'username'@'localhost';
3.2.3 视图与权限
数据库视图可以看作是虚拟的表,为了更好地控制用户对数据的访问,可以使用视图。创建视图并将权限授予用户,有助于实现更灵活的权限管理。
CREATE VIEW my_view AS SELECT * FROM my_table WHERE condition;GRANT SELECT ON my_database.my_view TO 'username'@'localhost';
写在最后
通过本篇博客,我们深入了解了MySQL中用户权限管理的方方面面。合理的权限管理不仅可以提高数据库的安全性,还能够优化数据库的运行效率。希望本文对你在MySQL数据库管理中的实践有所帮助。下一篇MySQL修炼手册中,我们将继续探讨数据库管理的其他关键主题。敬请期待!
相关文章:
MySQL修炼手册14:用户权限管理:安全保障与数据隔离
目录 写在开头1 用户与权限的关系1.1 用户的创建与删除1.1.1 创建新用户1.1.2 批量创建用户1.1.3 安全删除用户 1.2 授予与撤销权限1.2.1 授予权限1.2.2 批量授予权限1.2.3 撤销权限 2 角色的应用2.1 创建与管理角色2.1.1 创建角色2.1.2 管理角色 2.2 将权限赋予角色2.2.1 将权…...
动态规划解决马尔可夫决策过程
马尔可夫决策过程是强化学习中的基本问题模型之一,而解决马尔可夫决策过程的方法我们统称为强化学习算法。 动态规划( dynamic programming, DP )具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子…...
ubuntu1604安装及问题解决
虚拟机安装vmbox7 虚拟机操作: 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…...
Leetcode—24. 两两交换链表中的节点【中等】
2023每日刷题(八十七) Leetcode—24. 两两交换链表中的节点 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x),…...
USRP相关报错解决办法
文章目录 前言一、本地环境二、相关报错信息二、解决办法1、更换电脑操作系统2、升级最新版固件 前言 在进行 USRP 开发时遇到了一些报错,这里做个记录解决问题的方法。 一、本地环境 电脑操作系统:Windows11MATLAB 版本:MATLAB 2021aUSRP …...
【剑指offer】重建二叉树
👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer:重建二叉树 给定节…...
中仕教育:事业编招考全流程介绍
一、报名阶段 1. 了解查看招聘信息:查看各类事业编岗位的招聘信息,包括岗位职责、招聘条件、报名时间等。 2. 填写报名表:按照要求填写报名表,包括个人信息、教育背景、工作经历等内容。 3. 提交报名材料:将报名表及…...
149. 直线上最多的点数
149. 直线上最多的点数 class MaxPoints:"""149. 直线上最多的点数https://leetcode.cn/problems/max-points-on-a-line/description/?envTypestudy-plan-v2&envIdtop-interview-150"""def solution(self, points: List[List[int]]) ->…...
不合格机器人工程讲师再读《悉达多》-2024-
一次又一次失败的经历,让我对经典书籍的认同感越来越多,越来越觉得原来的自己是多么多么的无知和愚昧。 ----zhangrelay 唯物也好,唯心也罢,我们都要先热爱这个世界,然后才能在其中找到自己所热爱的事业。 ----zh…...
【STM32CubeMX串口通信详解】USART2 -- DMA发送 + DMA空闲中断 接收不定长数据
( 本篇正在编写、更新状态中.....) 文章目录: 前言 前言 本篇,详细地用截图解释 CubeMX 对 USART2 的配置,HAL函数使用,和收发程序的编写。 收、发机制:DMA发送 DAM空闲中断接收。 DMA空…...
Webpack5入门到原理19:React 脚手架搭建
开发模式配置 // webpack.dev.js const path require("path"); const ESLintWebpackPlugin require("eslint-webpack-plugin"); const HtmlWebpackPlugin require("html-webpack-plugin"); const ReactRefreshWebpackPlugin require("…...
苹果眼镜(Vision Pro)的开发者指南(6)-实战应用场景开发 - 游戏、协作、空间音频、WebXR
第一部分:【构建游戏和媒体体验】 了解如何使用visionOS在游戏和媒体体验中创建真正身临其境的时刻。游戏和媒体可以利用全方位的沉浸感来讲述令人难以置信的故事,并以一种新的方式与人们联系。将向你展示可供你入门的visionOS游戏和叙事开发途径。了解如何使用RealityKit有…...
flutter底层架构初探
本文出处:Flutter 中文开发者网站 架构 embedder嵌入层 提供程序入口(其他原生应用也采用此方式),程序由此和底层操作系统协调(surface渲染、辅助功能和输入服务,管理事件循环…...
初识SQL注入
目录 注入攻击 SQL注入 手工注入 Information_schema数据库 自动注入 介绍一下这款工具:sqlmap 半自动注入 前面给大家通过学习练习的方式将XSS攻击的几种形式和一些简单的靶场和例题的演示,从本篇开始我将和小伙伴们通过边复习、边练习的方式来进…...
React初探:从环境搭建到Hooks应用全解析
React初探:从环境搭建到Hooks应用全解析 一、React介绍 1、React是什么 React是由Facebook开发的一款用于构建用户界面的JavaScript库。它主要用于构建单页面应用中的UI组件,通过组件化的方式让开发者能够更轻松地构建可维护且高效的用户界面。 Reac…...
设计模式——1_6 代理(Proxy)
诗有可解不可解,若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子:图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理:镜中月,水中花保护代理:对象也该有隐私引用代理:…...
性能优化(CPU优化技术)-NEON 介绍
「发表于知乎专栏《移动端算法优化》」 本节主要介绍基本 SIMD 及其他的指令流与数据流的处理方式,NEON 的基本原理、指令以及与其他平台及硬件的对比。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:…...
Kafka-服务端-KafkaController
Broker能够处理来自KafkaController的LeaderAndIsrRequest、StopReplicaRequest、UpdateMetadataRequest等请求。 在Kafka集群的多个Broker中,有一个Broker会被选举为Controller Leader,负责管理整个集群中所有的分区和副本的状态。 例如:当某分区的Le…...
ffmpeg使用手册
ffmpeg使用手册 文章目录 ffmpeg使用手册ffmpeg是什么指令总结1.查看ffmpeg版本2.mkv转mp43.裁剪 .mkv 视频4.不调节帧率,尽可能保证原视频质量的情况下将原始视频压缩4.1 crf4.2 preset 5.调节视频帧率6.调节帧率,尽可能保证原视频质量的情况下将原始视…...
操作系统导论-课后作业-ch15
对应异步社区资源HW-Relocation: 1. 种子1运行结果: 种子2运行结果: 种子3运行结果: 2. 需要将界限设置为930,结果如下: 3. 有人说原书翻译有误,原文如下所示: 原文翻译如…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
