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

Mysql权限

用户做权限控制,分两个阶段:

第一个阶段用户能不能登录到mysql

第二个阶段是登录到mysql来拥有什么权限

两个阶段分别查看不一样的表,权限全部都记录在表里面。

Mysql里面用户的权限,先判断是不是root账户,如果是root账户就没得说,什么权限都有。

拿什么当依据?

四张表:user db (5.1/5.5版本有host表) tables_priv columns_priv

但是从5.5之后,比如5.7host表就没用了。用user db tables_priv columns_priv这四张表做权限控制。这四张表对应的权限是由范围最大到最小。

比如现在有账户tom,tom在登录的时候,第一件事就去user表找一找有没有你这个账户,如果有这个账户就让你登录,如果没这个账户,就连登录都登录不了。只有登录进去之后,才会进入第二个阶段,判断有什么样的权限。第二个阶段,第一张看的表还是user,要看user表里的select权限是不是Y。如果在user表里的权限是Y,后面的表都不用看了,你对所有的库,所有的表都会拥有select权限,这个权限范围是最大的。如果select权限不是Y那就是N。这里写的N不代表没有select权限,你的权限不是最大范围的权限,要把范围缩小一点,看是不是对msyql里边其中一个库或几个库有权限。这时候去查db表了,去看你是不是对某一个独立的单独的库有权限,比如你对db1这个库有select权限Y。虽然不是对所有的库里边所有的表都有select权限,但是我对其中某一个库有这个权限,这个库是说的库里边所有的表。假如在这个db表里我的权限也是N。这也不代表我什么权限都没有,那我把范围在缩小一点。

我再去查看tables_priv,这张表记录的是你是不是对某一张表有权限,范围是越来越小了。刚开始user表记录的权限是最大的权限,它的范围涉及到整个msyql里边所有的库,所有的表,如果是N,就看db,很明显是库的意思,那我看你是不是对某一个库有权限,现在连整个库都管不了,那我就看看某一个库里的某一张表,你是不是有权限,这时候它去看tables_priv这张表,他看这张表里面你是不是对某一张表有权限,如果有肯定是有select权限的Y,如果这里是Y,代表的你对我这张表是可以查看所有的字段所有的记录。如果在这里也没权限。最后他要去看columns_priv,看看你是不是对某一张表里的某一列有权限,你连查看某一列的权限都没有,我就判定你只能登录。啥也干不了,什么权限都没有。

总结 先看看你是不是有大范围的权限,没有的话我把范围缩小一点到库,如果没有再缩小到表,再没有缩小到列,缩小到字段,如果连字段的权限都没有,那你就什么权限都没有。

四张表:user db tables_priv columns_priv

1.用户认证

查看mysql.user表, 只看user表user表有,能登录,没有不能,假装能登录才会进入第二阶段。

2.权限认证

以select权限为例:其他权限都一样

先看 user表里的select_priv权限值是Y还是N

Y 如果是Y,代表着对所有库里边的所有表都有select权限,就不用再往下检查,权限检查过程就结束了。

N 只有在select是N的情况下,才会接着看db表

db

Y 不会接着查看其他的表 拥有查看所有库所有表的权限

N 接着看tables_priv表

tables_priv

table_priv: 如果这个字段的值里包括select 拥有查看这张表所有

字段的权限,不会再接着往下看了

table_priv:如果这个字段的值里不包括select,接着查看下张表

还需要有column_priv字段权限

columns_priv

column_priv: 有select,则只对某一列有select权限

没有则对所有库所有表没有任何权限

验证第一步  select

 创建一个tim账户,在不创建的时候肯定不能登录,有了账户是可以登录了。但是什么权限都没有,任何有用的东西都看不到。它就没有select权限。

 select * from mysql.user\G  找到tim,它的select权限是N。在root用户

 再打开一个终端 mysql -u tim 登录进去

然后show databases; 啥权限都没有

_

 去改select_priv的值,在root用户

 

 直接修改表的内容一定要flush privileges;刷新权限

去另一个终端,退出去重新登录一下,重新show就看见mysql了。use mysql;也进去了,show tables;也能看,里面任何一张表也能看,比如select * from user\G也能看。

 

 

 但是改不了,跟修改有关的操作都做不了。

比如创建一张表,没有权限,不属于select权限,因为刚才的授权只做了select的授权

现在去观察授权,发现select变成Y。说明jim这个账户在所有的库所有的表都拥有select权限。

验证第二步db

 首先得把select_priv Y改成 N,之后再去观察db表长什么样子。

创建db1库,db2库,创建了两个表,两个表里都会有一条记录。

需要去添加host,db,user,select_priv字段,需要添加一条记录。这个权限表明jim账户从本地登录的时候,只能操作db1这个库里所有的表,其他的库它还是看不了。

 host(从哪台机器可以登录)

 db  指定它能操作哪个库,比如db1

user  哪个账户  jim

select_priv  权限是Y,user表里的改成N

flush privileges;刷新权限

测试

 能看见db1了,db2根本看不了,因为只授了db1的权限给它,

 use db1;里面的表都能看得见,也能select,但是它没有插入权限,也操作不了其他的库。

在测试之前,一定要观察一下表里的字段,因为都长得不一样。

 比如tables_priv这张表要添加记录就要添加这些。tables_priv:select 要给他权限

desc mysql.columns_priv

 插入这条记录,要有6个数据。从哪台机器可以登录到哪个库,使用的哪个账户,它能操作哪个表里面的哪个列,对列拥有的是什么权限,如果只想给它select权限就给它select,而且它是用的set类型的。set可以从这里面选多个,可以同时给它设置多个权限。

查看权限 (可以直接查看表,可以不用这些命令)

看自己的权限:SHOW GRANTS\G

看别人的权限:SHOW GRANTS FOR admin1@'%'\G

撤销权限:revoke简单一点,也可以直接修改表,

语法:REVOKE 权限列表 ON 数据库名 FROM 用户名@‘客户端主机’

例如:

mysql> revoke all on *.* from 'xiaowu'@'%'; 撤销xiaowu的权限

(all是撤销什么权限 *.*哪张库哪张表里的权限)这种方法是撤销某一个权限,比如它拥有所有的权限,我只撤销它的删除权限,就用这种方法

mysql> revoke delete on *.* from admin1@’%’;  //回收部分权限

(这种方法是撤销某一个权限,比如它拥有所有的权限,我只撤销它的删除权限,就用这种方法)

REVOKE ALL PRIVILEGES ON *.* FROM admin2@’%’; //回收所有权限

REVOKE ALL PRIVILEGES,GRANT OPTION ON *.* FROM 'admin2'@'%';

刷新权限

方式1:

mysql > flush privileges;

方式2:

# mysqladmin flush-privileges -u root -p1

相关文章:

  • 微信小程序开发实战(SM周期及WXS脚本)
  • 实训任务1:Linux基本操作
  • C++11新特性精讲(多线程除外)
  • SpringCloud——Ribbon
  • 2022 华为杯数学建模研赛思路分享
  • MySql经典50道SQL练习题
  • 基于紧凑度和调度处理的粒子群优化算法-附代码
  • Keras深度学习实战——使用循环神经网络构建情感分析模型
  • 【中国大学生计算机大赛二等奖】智能中医-中e诊简介(一)
  • 【Linux】挂载硬盘、镜像文件、rpm软件包管理器、yum软件包管理器、软件安装jdk、tomcat、mysql
  • 【IDEA主题极致优化】全面优提升你的编码体验
  • 【论文阅读】Finetuned Language Models Are Zero-Shot Learners
  • Node.js基础常用知识点全总结
  • 大数据必学Java基础(七十):不要用字符流去操作非文本文件
  • 单片机控制LED数码管的显示
  • 【译】理解JavaScript:new 关键字
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android图片蒙层
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Python连接Oracle
  • Python语法速览与机器学习开发环境搭建
  • socket.io+express实现聊天室的思考(三)
  • sublime配置文件
  • Vim Clutch | 面向脚踏板编程……
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 对超线程几个不同角度的解释
  • 聊聊redis的数据结构的应用
  • 前端代码风格自动化系列(二)之Commitlint
  • 数据可视化之 Sankey 桑基图的实现
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 06-01 点餐小程序前台界面搭建
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (20050108)又读《平凡的世界》
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三分钟)速览传统边缘检测算子
  • (一)基于IDEA的JAVA基础10
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)shell调试方法
  • 、写入Shellcode到注册表上线
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 8.0 中有哪些新的变化?
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .Net下的签名与混淆
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .sys文件乱码_python vscode输出乱码
  • /bin/rm: 参数列表过长"的解决办法
  • @Bean有哪些属性
  • @RequestMapping-占位符映射