当前位置: 首页 > article >正文

【MySQL】验证账户权限

在用户进行验证之后,MySQL将提出以下问题验证账户权限:

1.谁是当前用户?

2.该用户有何权限?

  • 管理权限比如:shutdown、replication slave、load data infile。
  • 数据权限比如:select、insert、update、delete。

3.这些权限适用于何处?

  • global、database、table、column、stored routine(存储例程包括存储过程和存储函数)。

grant语句

1.grant语句为mysql用户账户和角色分配权限或角色:

world数据库的所有权限授予r_viewer角色
GRANT SELECT ON world.* TO r_viewer;
world数据库的city表的更新删除权限授予kari用户 
GRANT UPDATE, DELETE ON world.city TO kari@localhost; 

grant 语句的子句包括:

  • 要授予的权限:select、update、delete等。
  • 权限级别:全局:*.* ;数据库:db_name.* ;表:db_name.table_name ;存储例程:db_name.routine_name。
  • 被授予权限的账户或角色。

2.指定列权限:

kari有权限读取mysql.user表中的user和host列
GRANT SELECT(user,host) ON mysql.user TO kari@localhost; 

3.在同一语句中可以应用表级和列级权限:

r_updater角色可以更新world.country表中的Name列,还可以删除该表
GRANT UPDATE(Name), DELETE ON world.country TO r_updater; 

4.将角色授予mysql用户账户和其他角色时,grant语句不带ON子句:

r_viewer, r_updater角色授予r_world角色
GRANT r_viewer, r_updater TO r_world;
r_viewer, r_updater角色授予kari用户,并且kari可以将角色授予其他用户账户
GRANT r_viewer, r_updater TO kari@localhost WITH ADMIN OPTION;

5.显示自己的账户权限:show grants / show grants for current_user();

6.显示其他用户权限:show grants for user@host;

7.显示角色的权限:show grants for 角色名;

用户权限限制

  • 在指定用户权限时,采用“白名单”模式,只能指定它可以干什么,不能显式指定它不能干什么。()
  • 不能授予行级权限。

撤销账户权限

revoke语句可以从用户账户和角色中撤销权限和角色。on子句指定要撤销的级别,from子句指定账户名或角色名。在发出 revoke 之前,一定要使用 show grants 语句来确定要撤销哪些权限和角色, 之后再次确认结果是否正确。

特殊权限

usage说明符授予连接到服务器的能力。这是新帐户的默认权限级别,可以使用该帐户访问服务器用于有限的目的,例如发出SHOW VARIABLES 或SHOW STATUS。不能使用帐户访问表之类的数据库内容,但可在以后授予此类权限。

REVOKE USAGE FROM kari@localhost 

MySQL的访问控制分为两个独立层面:

连接认证层(能否登录)

  • mysql.user表中的账户记录控制

  • 检查密码、账户锁定状态、认证插件等

操作权限层(能做什么)

  • 由各种权限表(tables_priv等)控制

  • USAGE属于这一层

该语句撤销了kari用户的usage权限,不会阻止用户登录服务器。

激活角色权限

用户在使用被授予的角色权限之前,必须要先激活权限。

1.在服务器级别激活角色

SET PERSIST activate_all_roles_on_login = ON;

将 activate_all_roles_on_login 系统变量默认值为OFF,若设置为ON,服务器在登录时将激活授予每个账户的角色。

2.在用户级别激活

SET DEFAULT ROLE r_viewer, r_updater TO kari@localhost;
SET DEFAULT ROLE ALL TO kari@localhost, Jan@localhost;

SET DEFAULT ROLE 语句定义当用户连接到服务器时哪些角色变为活动角色.

或者,在CREATE USER 或ALTER USER 语句中使用DEFAULT ROLE 子句:

ALTER USER kari@localhost DEFAULT ROLE r_viewer, r_updater;
ALTER USER kari@localhost DEFAULT ROLE ALL;

用户级默认角色存储在 mysql.default_roles 授权表中。用户登录时会检查该表,使用记录的角色权限。

3.在会话级别激活角色

SET ROLE 语句可以修改当前会话中的活动角色列表。它接受角色列表或以下角色说明符之一:

  • DEFAULT:激活帐户默认角色
  • NONE:禁用所有角色
  • ALL:激活授予该帐户的所有角色
  • ALL EXCEPT:激活授予帐户的所有角色,但指定的角色除外。

SELECT CURRENT_ROLE() ;该函数确定当前会话中哪些角色处于活动状态。

强制性角色

强制性角色自动授予每个用户,使用 mandatory-roles 系统变量进行配置,在权限生效前自动激活,不会更改授权表,不能使用revoke、drop role 或 drop user 语句撤销或删除。

服务启动时读取 mandatory-roles ,优先于授权表加载这些角色,将强制角色权限注入运行时环境,最后加载常规授权表内容。

SET PERSIST mandatory_roles = '`role1`@`%`,role2,role3@localhost';

授权表

MySQL 服务器在启动时将授权表从mysql 数据库读取到内存中,并使所有访问控制决策都以这些表为依据。

主要授权表清单

  • 避免直接在授权表中修改用户帐户,直接更改授权表时犯错,则可能会将所有用户锁在系统外面,如果直接修改了授权表,应通过发出 FLUSH PRIVILEGES 语句显式重新装入授权表。
  • 帐户修改语句(如GRANT、REVOKE、SET PASSWORD 和RENAME USER)会将更改同时应用于授权表及其内存中表。
  • 对全局权限和口令的更改仅应用于该帐户的后续连接。
  • 对数据库级别权限的更改在客户机的下一此使用 USE db_name 语句后应用。
  • 对角色、表、列和例程权限的更改会立即应用。

http://www.kler.cn/a/611626.html

相关文章:

  • Spring 事件监听机制介绍以及源码分析
  • Elasticsearch 优化方案
  • 【Lua】一文快速掌握 Lua 语言指令(Lua 备忘清单)
  • 直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启
  • 【第30节】MFC编程:ListCtrl控件和TreeCtrl控件
  • SPI协议(20250325)
  • HarmonyOS:统一拖拽
  • 关于 K8s 的一些基础概念整理-补充
  • 交换机及其作用详解
  • [RITSEC CTF 2025] Crypto
  • vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu
  • 使用react 引入相对路径文件
  • 学习日记0327
  • xxljob阻塞处理策略设置为单机串行导致的bug
  • PyTorch 深度学习实战(22):多智能体强化学习(MARL)
  • 堆的常见应用2
  • 3.27【A】cv homework
  • 手撕LRU缓存Java版(带输入输出)
  • 《基于机器学习发电数据电量预测》开题报告
  • 学习本地部署DeepSeek的过程(基于LM Studio)