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

【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 语句后应用。
  • 对角色、表、列和例程权限的更改会立即应用。

相关文章:

  • Mysql-基础和DDL
  • DeepSeek 为何能在短时间内超过 ChatGPT?—— 技术变革与成本重构的双重胜利
  • Spring AI Alibaba EmbeddingModel使用
  • 堆的常见应用2
  • MySQL中的内连接与外连接详解:基础与进阶应用
  • 函数:链式访问
  • 【操作系统】(五)操作系统引导(Boot)
  • Leetcode13-罗马数字转整数
  • Django框架指南:从入门到进阶
  • 【蓝桥杯】3月27日笔记
  • C++:无序关联容器
  • 修改 docker0 网卡配置的详细步骤
  • Baklib内容中台驱动AI技术融合创新
  • 无穿戴动作捕捉设备:无穿戴,无标记点摄像头智能捕捉人体姿态
  • 【Exception】MybatisPlusException: can not find lambda cache for this entity
  • 【JavaScript】七、函数
  • Spring集成Web环境搭建
  • 什么是LangChain,为什么我们选择使用LangChain,以及它的典型应用场景
  • HCIE-day15-L3VPN
  • 练习:求平方根
  • 大兴西红门网站建设/北京seo方法
  • 阐述商业网站开发岗位需求分析/接外包项目的网站
  • ps做网站主页图片/软文写作发布
  • 简述网站开发的流程/广告投放平台有哪些
  • 比较好用的免费素材网/郑州seo外包服务
  • 怎样创建网站网站/长沙网站开发