MYSQL用户、权限管理(如何创建用户,给用户授权,远程登录)

文章目录


前言

MySQL的权限简单的理解就是MySQL允许你做你权利以内的事情,不可以越界。MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化。

存储账户权限信息表主要有:user、db、tables_priv、columns_priv、procs_priv、proxies_priv这六张表(5.6版本之前还有host表,现在已经把host内容整合进user表)


一、用户管理

1.用户信息

MySQL中的用户,都存储在系统数据库mysql的user表中:

cpp 复制代码
字段解释:
host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆
user: 用户名
authentication_string: 用户密码通过password函数加密后的
*_priv: 用户拥有的权限

2.创建用户

cpp 复制代码
语法:
create user '用户名'@'登陆主机/ip' identified by '密码';

下面我们创建一个用户:

这时我们便可以用新用户登录了!

3.删除用户

cpp 复制代码
语法:
drop user '用户名'@'主机名'

我们不能直接删除用户名,因为它默认是%,表示所有地方可以登陆的用户:

我们要删除的是从主机登录的用户:

4.修改密码

cpp 复制代码
自己改自己密码:
set password=password('新的密码');

set password for '用户名'@'主机名'=password('新的密码');

我们可以看到密码的字符串发生了变化,代表我们修改密码成功:

二、权限管理

1.权限管理概念

MYSQL用户权限管理主要有以下作用:

  1. 可以限制用户访问哪些库、哪些表
  2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
  3. 可以限制用户登录的IP或域名
  4. 可以限制用户自己的权限是否可以授权给别的用户

用户操作MYSQL数据库的权限管理,主要分为两个阶段:

  1. 有没有权限连接上来
  2. 有没有权限执行本操作

MYSQL连接权限

服务器如何判断用户有没有权限连接上来?

  1. 你从哪里来?host
  2. 你是谁?user
  3. 你的密码是多少?password

用户的这三个信息,存储在mysql库中的user表中。

操作执行权限

mysql数据库(系统数据库)下的表:user、db、tables_priv、columns_priv、proce_priv、proxies_priv共同构成授权表;

1)user表

user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

2)db表

db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

3)tables_priv表

tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。

4)columns_priv表

columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。

5)proce_priv

columns_priv表指定存储过程权限。这里代表允许使用某个存储过程的权限。

6)proxies_priv

利用 MySQL proxies_priv(模拟角色)实现类似用户组管理。角色(Role)可以用来批量管理用户,同一个角色下的用户,拥有相同的权限。

注:MySQL5.7.X以后可以模拟角色(Role)的功能,通过mysql.proxies_priv模拟实现

开始查询:

  1. 校验user表,对于全局权限是ok → 直接执行
  2. 检验DB表,对于某个有特定的数据库有权限 → 执行
  3. 检验tables_priv,对于特定数据库下的某些表是有权限 → 执行
  4. 检验columns_priv,对于特定表中的某些列有权限 → 执行

2.给用户授权

cpp 复制代码
语法:
grant [权限1,权限2,权限3] on *.* to user@'host' identified by 'password'

例如,给"zhangsan" 用户管理员权限,并且允许该用户继续给别的用户赋权限
grant all privileges on *.* to 'zhangsan'@'192.168.1.%' with grant option;

说明:
all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写"*"表示所有数据库,所有表。
	如果我要指定将权限应用到test库的user表中,可以这么写:test.user
to:将权限授予哪个用户。格式:"用户名"@"登录IP或域名"。%表示没有限制,在任何主机都可以登录
with grant option:允许被授权的用户把得到的权限继续授给其它用户
identified by可选: 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户

注:使用GRANT添加权限,权限会自动叠加,不会覆盖之前授予的权限

我们用之前创建的用户wml来登录:

然后我们给它授予 test1 库的 select 权限:

我们测试用户是否有其它权限:

3.回收权限

cpp 复制代码
语法:
revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';

我们回收用户所有权限:

然后用下面语句刷新一下权限:

cpp 复制代码
flush privileges;

然后用户再进行操作,发现除了登录什么都做不了:

相关推荐
阿巴斯甜18 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker19 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952720 小时前
Andorid Google 登录接入文档
android
黄林晴21 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android