MySQL中的用户权限


用户和权限管理

设置密码安全级别

# root 根用户 (超级管理员)
# 用户信息表:mysql.user
FLUSH PRIVILEGES;-- 刷新权限

INSTALL PLUGIN validate_password SONAME 'validate_password.so';-- 安装并激活密码规则插件

SHOW VARIABLES LIKE 'validate_password%';-- 进行查看密码强度

SET GLOBAL validate_password_policy = 0;-- 进行设值密码强度为低,但是密码至少8位
# 或者
SET GLOBAL validate_password_policy = LOW;

创建与删除用户

## 创建新用户
CREATE USER  用户名@地址  IDENTIFIED BY [PASSWORD] 密码(字符串) ;

## 增加本地用户
CREATE USER 'tom'@'localhost' IDENTIFIED BY '12345678'; -- 增加用户

## 增加远程用户
CREATE USER 'tom'@'%' IDENTIFIED BY '12345678';

-- 创建用户必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
-- CREATE USER语句只能创建用户,不能赋予权限。
-- 用户名,注意引号:如 'user_name'@'192.168.1.%'
-- 密码也需引号,纯数字密码也要加引号
-- 要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD

## 修改用户
RENAME USER old_user TO new_user;-- 重命名用户
RENAME USER tom TO tom2;

## 修改密码
## MySQL5版本修改密码
SET PASSWORD = PASSWORD ( '12345678' );-- 设置管理员密码(MySQL8.0之后删除了该语法)
SET PASSWORD FOR 用户名 = PASSWORD ( '密码' );-- 为指定用户设置密码
#### 例如
SET PASSWORD FOR 'tom' @'%' = PASSWORD ( '12345678' );

## mysql8.0之后版本修改密码
ALTER USER 'tom' @'%' IDENTIFIED BY '12345678';

## 删除用户
DROP USER 用户名;
### 例如:
DROP USER tom2;

用户权限设置

-- 分配权限/添加用户
GRANT 权限列表 ON 库名.表名 TO 用户名 [ IDENTIFIED BY [ PASSWORD ] 'password' ] 
-- all privileges 表示所有权限可以简写成 all,它不包括GRANT OPTION (分配权限的权限);
-- *.* 表示所有库的所有表
-- 库名.表名 表示某库下面的某表

## 赋予tom所有权限
GRANT ALL PRIVILEGES ON school.* TO "tom" @"%";

## 赋予tom插入数据、查询数据的权限
GRANT INSERT, SELECT ON school.* TO "tom" @"%";

# 查看用户的权限
SHOW GRANTS FOR 用户名;-- 查看当前用户权限
SHOW GRANTS FOR root@localhost;-- 查看权限

SHOW GRANTS;-- 查询所有用户权限
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();

## 删除权限
REVOKE 权限列表 ON 库名.表名 FROM 用户名; -- 撤消用户的某个权限

REVOKE ALL PRIVILEGES, GRANT OPTION ON 库名.表名  FROM 用户名; -- 撤销用户的所有权限

权限列表

-- 权限列表
ALL [PRIVILEGES]    -- 设置除GRANT OPTION之外的所有简单权限
ALTER               -- 允许使用ALTER TABLE
ALTER ROUTINE       -- 更改或取消已存储的子程序
CREATE              -- 允许使用CREATE TABLE
CREATE ROUTINE      -- 创建已存储的子程序
CREATE TEMPORARY TABLES      -- 允许使用CREATE TEMPORARY TABLE
CREATE USER        -- 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW        -- 允许使用CREATE VIEW
DELETE             -- 允许使用DELETE
DROP               -- 允许使用DROP TABLE
EXECUTE            -- 允许用户运行已存储的子程序
FILE               -- 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE
INDEX              -- 允许使用CREATE INDEX和DROP INDEX
INSERT             -- 允许使用INSERT
LOCK TABLES        -- 允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS            -- 允许使用SHOW FULL PROCESSLIST
REFERENCES         -- 未被实施
RELOAD             -- 允许使用FLUSH
REPLICATION CLIENT   -- 允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE    -- 用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT               -- 允许使用SELECT
SHOW DATABASES       -- 显示所有数据库
SHOW VIEW        -- 允许使用SHOW CREATE VIEW
SHUTDOWN         -- 允许使用mysqladmin shutdown
SUPER            -- 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE           -- 允许使用UPDATE
USAGE            -- “无权限”的同义词
GRANT OPTION     -- 允许授予权限

案例练习

1.添加用户:

快速创建用户:

格式:
create user 'username'@'ip地址' identified by '密码';

添加用户可能会出现密码验证强度过高的提示,解决方法为:

show variables like 'validate_password%'; -- 查看密码强度
set global validate_password_policy=LOW;  -- 设值密码强度为低

( 注意:ip地址所选范围: %为所有ip localhost 只为本地连接 )

一般创建用户并赋予特定权限:

格式:
grant 权限 on 数据库.* to 用户名@登录的主机 identified by "密码";    -- 【 默认全部操作权限 】

例1:增加一个admin1用户,密码为123,可以在任何主机上登录,并对所有数据库有查询、增加、修改和删除的功能。需要在mysql的root用户下进行

create user "admin1"@"%" identified by "12345678";
grant select,insert,update,delete on *.* to "admin1"@"%";
flush privileges;

例2:增加一个admin2用户,密码为123,只能在192.168.8.1 上登录,并对数据库student有查询,增加,修改和删除的功能。需要在mysql的root用户下进行

create database student charset utf8mb4;

create user "admin2"@"192.168.8.1" identified by '12345678';
grant select,insert,update,delete on student.* to  "admin2"@"192.168.8.1";
flush privileges;

查看所有的用户

use mysql
select user,host form user;

2.更新用户名或者ip:

rename user '旧的用户名'@'旧的ip地址'  to '新的用户名'@'新的ip地址'

rename user 'admin1'@'%'  to 'lily'@'192.168.8.%';

3.登录用户:

mysql  -u用户名 -p  -hIP地址

mysql -ulily -p12345678 -h192.168.8.100

注意:创建指定ip地址的用户,登录时需要指定对应的ip地址

4. 授权用户admin3拥有数据库student的所有权限

-- mysql5.7 即以下版本可以创建用户的同时赋予权限,在mysql8中默认无法使用,
grant all privileges on student.* to "admin3"@"localhost" identified by '12345678';
flush privileges;

-- mysql8.0 中创建用户和设置权限需要分开执行
create user "admin3"@"localhost" identified by '12345678';
grant all privileges on student.* to "admin3"@"localhost";
flush privileges;

5.修改用户密码

此方法是mysql5.x的方法,mysql8.x无法使用

update mysql.user set password=password('123456') where user='admin1' and host='localhost';
flush privileges;

6.删除用户

drop user 用户名@'%';
drop user 用户名@localhost;

# 或者
use mysql;
delete from user where user="用户名";

7.grant 普通数据用户,查询、插入、更新、删除数据库中所有表数据的权利

grant select on admindb.* to user1@'%';
grant insert on admindb.* to user1@'%';
grant update on admindb.* to user1@'%';
grant delete on admindb.* to user1@'%';

或者一条查询所有:

grant select, insert, update, delete on admindb.* to user1@'%';

8.grant 数据库开发人员,创建表、索引、视图、存储过程、函数等权限

-- grant 创建、修改、删除 MySQL 数据表结构权限
grant create on testdb.* to developer@'192.168.8.%';
grant alter on testdb.* to developer@'192.168.8.%';
grant drop on testdb.* to developer@'192.168.8.%';

-- grant 操作 MySQL 外键权限
grant references on testdb.* to developer@'192.168.8.%';

-- grant 操作 MySQL 临时表权限
grant create temporary tables on testdb.* to developer@'192.168.8.%';

-- grant 操作 MySQL 索引权限
grant index on testdb.* to developer@'192.168.8.%';

-- grant 操作 MySQL 视图、查看视图源代码 权限
grant create view on testdb.* to developer@'192.168.8.%';
grant show view on testdb.* to developer@'192.168.8.%';

-- grant 操作 MySQL 存储过程、函数 权限
grant create routine on testdb.* to developer@'192.168.8.%';
grant alter routine on testdb.* to developer@'192.168.8.%';
grant execute on testdb.* to developer@'192.168.8.%';

9.grant 普通 test1管理某个 MySQL 数据库的权限

grant all privileges on admindb to test1@'localhost'
-- 其中,关键字 “privileges” 可以省略。

10.grant 高级 test1管理 MySQL 中所有数据库的权限

grant all on *.* to test1@'localhost';

11.grant作用在整个服务器上:

grant select on *.* to admin1@localhost; -- admin1 可以查询 MySQL 中所有数据库中的表
grant all    on *.* to admin1@localhost; -- admin1 可以管理 MySQL 中的所有数据库

12.grant 作用在单个数据库上:

grant select on admindb.* to admin@localhost;  -- admin 可以查询 admindb中的表
grant select,insert,update,delete on admindb.orders to admin@localhost;  -- admin 可以查询、添加、修改及删除 admindb中的表orders

13.grant 作用在表中的列上:

grant select(id, name, age) on admindb.goods_log to admin@localhost;

14.grant 作用在存储过程、函数上:

grant execute on procedure admindb.goods_log to admin@localhost
grant execute on function admindb.goods_log to admin@localhost

15.查看当前用户(自己)权限:

show grants;

16.查看其他 MySQL 用户权限:

show grants for admin@localhost;

17.撤销已经赋予给 MySQL 用户权限的权限;

revoke  grant 的语法差不多,只需要把关键字 "to" 换成 "from" 即可:
-- grant all on *.* to admin@localhost;
revoke all on *.* from admin@localhost;