目录
一、用户管理
1.创建用户
2.查看用户
3.修改用户
4.删除用户
5.设置当前用户密码
6.修改其他用户密码
7.用户密码管理
二、权限管理
1.授予权限的原则
2.权限列表
3.授予权限
4.查看权限
5.收回权限
三、权限表
1.user表
2.db表
3.tables_priv表和columns_priv表
4.procs_priv表
四、角色管理
1.创建角色
2.给角色赋予权限
3.查看角色的权限
4.回收角色的权限
5.删除角色
6.给用户赋予角色
7.激活角色
8.撤销用户角色
CREATE USER '用户名'@'主机' [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];
USE mysql; #使用'mysql'数据库
SELECT host,user #查找host和user两个字段
FROM user;
#直接修改mysql.user表中的字段
UPDATE user
SET user='zhangsan1',host='%'
WHERE user='zhangsan';
#刷新修改
FLUSH PRIVILEGES;
1.使用DROP USER语句来删除用户时,必须用于DROP USER权限。DROP USER语句的基本语法形式如下:
DROP USER '用户名'@'主机'[,'用户名'@'主机'];
如果不指定host,默认删除的是host为%的用户。否则需要指定host。
2.使用DELETE方式删除
DELETE FROM mysql.user WHERE Host='hostname' AND User='username';
执行完DELETE命令后要使用FLUSH命令来使用户生效。
不推荐通过DELETE直接删除user表的信息,系统会有残留信息保留。而DROP命令会删除用户以及对应的权限,执行命令后你会发现mysql.user表和mysql.db表的相应记录都消失了。
1. 使用ALTER USER命令来修改当前用户密码,用户可以使用ALTER命令来修改自身密码,如下语句代表修改当前登录用户的密码。基本语法如下:
ALTER USER USER() IDENTIFIED BY 'new_password';
#USER()函数返回当前用户和主机
2. 使用SET语句来修改当前用户密码 使用root用户登录MySQL后,可以使用SET语句来修改密码,具体 SQL语句如下:
SET PASSWORD='new_password';
该语句会自动将密码加密后再赋给当前用户。
1. 使用ALTER语句来修改普通用户的密码 可以使用ALTER USER语句来修改普通用户的密码。
ALTER USER user [IDENTIFIED BY '新密码'] [,user[IDENTIFIED BY '新密码']]…;
2. 使用SET命令来修改普通用户的密码 使用root用户登录到MySQL服务器后,可以使用SET语句来修改普通用户的密码。
SET PASSWORD FOR 'username'@'hostname'='new_password';
3. 使用UPDATE语句修改普通用户的密码(不推荐)
UPDATE mysql.user SET authentication_string=PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";
设置用户密码过期时间
--设置用户的密码过期
ALTER USER user PASSWORD EXPIRE [INTERVAL n DAY|NEVER|DEFAULT];
--1.立即过期、2.指定n天过期、3.从不过期、4.默认时间
设置全局密码过期时间:
--第一种: 建立全局策略,设置密码每隔180天过期
SET PERSIST default_password_lifetime = 180;
#第二种:设置配置文件
[mysqld]
default_password_lifetime=180 #建立全局策略,设置密码每隔180天过期
权限控制主要是出于安全因素,因此需要遵循以下几个经验原则 :
#查看权限列表
show privileges;
给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权 。
授权命令:
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
该权限如果发现没有该用户,则会直接新建一个用户。
如:
给lxc用户用本地命令行方式,授予db1这个库下的所有表的插改的权限。
GRANT select,update on db1.* to 'lxc'@'localhost'
授予通过网络方式登录的zhangsan用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包括grant的权限
GRANT ALL PRIVILEGES ON *.* TO zhangsan@'%' IDENTIFIED BY '123';
SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'user'@'主机地址' ;
REVOKE语句取消用户的某些权限。使用REVOKE收回权限之后,用户账户的记录将从 db、host、tables_priv和columns_priv表中删除,但是用户账户记录仍然在user表中保存。
使用DROP删除用户会删除这些权限表中的记录。
收回权限须用户重新登录后才能生效
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
如:
#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM lxc@'%';
#收回lxc对db1下所有表的更新权限
REVOKE update on db1.* FROM 'lxc'@'%'
user表是mysql中最重要的一个权限表, 记录用户账号和权限信息 。如下:
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
| Process_priv | enum('N','Y') | NO | | N | |
| File_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Show_db_priv | enum('N','Y') | NO | | N | |
| Super_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Repl_slave_priv | enum('N','Y') | NO | | N | |
| Repl_client_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Create_user_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
| Create_tablespace_priv | enum('N','Y') | NO | | N | |
| ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int unsigned | NO | | 0 | |
| max_updates | int unsigned | NO | | 0 | |
| max_connections | int unsigned | NO | | 0 | |
| max_user_connections | int unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint unsigned | YES | | NULL | |
| account_locked | enum('N','Y') | NO | | N | |
| Create_role_priv | enum('N','Y') | NO | | N | |
| Drop_role_priv | enum('N','Y') | NO | | N | |
| Password_reuse_history | smallint unsigned | YES | | NULL | |
| Password_reuse_time | smallint unsigned | YES | | NULL | |
| Password_require_current | enum('N','Y') | YES | | NULL | |
| User_attributes | json | YES | | NULL | |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列。
安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于加密 ;两个是x509 相关的(x509_issuer、x509_subject),用于标识用户 ;另外两个Plugin字段用于验证用户身份的插件, 该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份。
资源控制列的字段用来限制用户使用的资源 ,包含4个字段,分别为:
mysql> desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Grant_priv | enum('N','Y') | NO | | N | |
| References_priv | enum('N','Y') | NO | | N | |
| Index_priv | enum('N','Y') | NO | | N | |
| Alter_priv | enum('N','Y') | NO | | N | |
| Create_tmp_table_priv | enum('N','Y') | NO | | N | |
| Lock_tables_priv | enum('N','Y') | NO | | N | |
| Create_view_priv | enum('N','Y') | NO | | N | |
| Show_view_priv | enum('N','Y') | NO | | N | |
| Create_routine_priv | enum('N','Y') | NO | | N | |
| Alter_routine_priv | enum('N','Y') | NO | | N | |
| Execute_priv | enum('N','Y') | NO | | N | |
| Event_priv | enum('N','Y') | NO | | N | |
| Trigger_priv | enum('N','Y') | NO | | N | |
+-----------------------+---------------+------+-----+---------+-------+
1. 用户列 db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
2. 权限列 Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。
tables_priv表用来对表设置操作权限 ,columns_priv表用来对表的某一列设置权限 。tables_priv表和columns_priv表的结构分别如图:
mysql> desc tables_priv;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | varchar(288) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------------------------+
mysql> desc columns_priv;
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------------------------+
procs_priv表可以对存储过程和存储函数设置操作权限。
mysql> desc procs_priv;
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
| Host | char(255) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(32) | NO | PRI | | |
| Routine_name | char(64) | NO | PRI | | |
| Routine_type | enum('FUNCTION','PROCEDURE') | NO | PRI | NULL | |
| Grantor | varchar(288) | NO | MUL | | |
| Proc_priv | set('Execute','Alter Routine','Grant') | NO | | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------------------------+
引入角色的目的是 方便管理拥有相同权限的用户 。恰当的权限设定,可以确保数据的安全性。
创建角色使用 CREATE ROLE 语句,语法如下:
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
角色名称的命名规则和用户名类似。如果 host_name省略,默认为% , role_name不可省略 ,不可为空。
角色和用户比较:
创建角色之后,默认这个角色是没有任何权限的,我们需要给角色授权。给角色授权的语法结构是:
GRANT privileges ON table_name TO 'role_name'[@'host_name'];
查看权限privileges:
SHOW PRIVILEGES\G;
用法和前面的用户相同。
SHOW GRANTS FOR '角色名';
如:
mysql> grant select on db1.emp to role1;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'role1';
+--------------------------------------------+
| Grants for role1@% |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `role1`@`%` |
| GRANT SELECT ON `db1`.`emp` TO `role1`@`%` |
+--------------------------------------------+
USAGE ON *.*表示连接登录数据库的权限,默认就有
REVOKE privileges ON tablename FROM 'rolename';
DROP ROLE role [,role2]...
如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限 。
角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。
GRANT role [,role2,...] TO user [,user2,...];
将角色的赋给对应的用于,查看该用户的权限会显示出来。
但是还需要激活角色,才能使角色生效,如果未激活,将角色赋给某个用户,将显示NONE。如下
mysql> select current_role();
+----------------+
| current_role() |
+----------------+
| NONE |
+----------------+
方式1:使用set default role 命令激活角色
#单个激活
SET DEFAULT ROLE ALL TO 'zhangsan'@'localhost';
-- 批量激活
SET DEFAULT ROLE ALL TO
'dev1'@'localhost',
'read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
方式2:将activate_all_roles_on_login设置为ON
默认情况:
mysql> show variables like 'activate_all_roles_on_login';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| activate_all_roles_on_login | OFF |
+-----------------------------+-------+
设置为开启状态,就不需要手动激活角色了,对所有角色永久激活 。运行这条语句之后,用户才真正拥有了赋予角色的所有权限。
SET GLOBAL activate_all_roles_on_login=ON;
REVOKE role FROM user;