MySQL用户权限管理
一、创建用户格式
创建用户命令一般格式:
create user [用户名]@[访问地址] identified by [密码]
举例1:创建zhangsan用户,只是创建用户并没有权限,'localhost'表示只能在本地登录,无法通过远程连接;密码是 password
CREATE USER 'zhangsan'@'localhost' IDENTIFIED BY 'password';
举例2:创建lisi用户,只是创建用户并没有权限,密码为 password,%通配符表示任何主机都可以连接(可以远程连接),
CREATE USER 'lisi'@'%' IDENTIFIED BY 'password';
举例3:(5.7.7版本前)的创建用户并赋予RELOAD,PROCESS权限 ,在所有的库和表上;*.*:代表所有的库表
GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost' identified by '123456';
二、授权格式及示例:.
grant [权限1,权限2,权限3] on *.* to user@'host' identified by 'password'
常用权限:all privileges、create、drop、select、insert、delete、update
例如,给"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或域名”。%表示没有限制,在任何主机都可以登录。比如:'zhangsan'@'192.168.1.%',表示zhangsan这个用户只能在192.168.0.* IP段登录
- with grant option:通过在grant语句的最后使用该子句,就允许被授权的用户把得到的权限继续授给其它用户
注:使用GRANT添加权限,权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个SELECT权限,后来又给用户添加了一个UPDATE权限,那么该用户就同时拥有了SELECT和UPDATE权限。
1. 授予管理员权限
举例4:把zhangsan 变成管理员用户,拥有root权限
mysql> GRANT ALL PRIVILEGES ON *.* TO 'zhangsan'@'localhost' WITH GRANT OPTION;
#刷新权限命令
mysql> flush privileges;
2. 授予数据库、表权限
举例5:授予用户zhangsan可以对test数据库中的所有表进行查询
grant select on test.* to zhangsan;
举例6:授予lisi在test数据库中创建、修改、删除表的权限以及创建视图的权限
grant create、alter、drop、create view on test.* to lisi;
举例7:授予lisi可以对当前数据库中的所有表进行查询, * :表示当前数据库
grant select on * to lisi;
举例8:授予lisi可以创建、修改、删除数据库以及对所有数据库中的所有表进行create、alter和drop
grant create,alter,drop on . to lisi;
举例9:授予lisi可以创建新用户
grant create user on . to lisi;
3. 授予列权限
举例10:给zhangsan用户赋权限,设置为在test库,shop表,上的id、name、price列只有select 权限
mysql> grant select(id,name,price) on test.temp to zhangsan@'localhost' WITH GRANT OPTION;
#刷新权限
mysql> flush privileges;
举例11:授予用户zhangsan可以对test.shop表的id和name列进行更新
grant update(id,name) on test.shop to zhangsan@'localhost';
举例12:查看自己的权限:
show grants;
三、修改用户配置:
1. 回收 mysql 权限
通过 revoke 命令收回用户权限,回收的时候看一下这个用户有哪些权限然后回收
show grants for admin@'localhost'; mysql> show grants \G *************************** 1. row *************************** Grants for admin@localhost: GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION 1 row in set (0.00 sec)
revoke :回收权限
mysql> revoke PROCESS ON *.* FROM admin@'localhost';
#刷新权限
mysql> flush privileges;
2. 删除 mysql 用户
drop user admin@'localhost';
3. 修改 mysql 用户密码
修改用户密码的方式包括以下三种:
-- 第一种 ALTER USER 'chenhh'@'localhost' IDENTIFIED BY 'mypassword'; -- 第二种 SET PASSWORD FOR 'chenhh'@'localhost' = PASSWORD('mypassword'); -- 第三种 GRANT USAGE ON *.* TO 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';
如在数据库外命令行中,通过:mysqladmin -u用户名 -p旧的密码 password 新密码
shell> mysqladmin -u user_name -h host_name password "new_password"
4. 忘记密码
1> 添加登录跳过权限检查配置
修改my.cnf,在mysqld配置节点添加skip-grant-tables配置
[mysqld]
skip-grant-tables
2> 重新启动mysql服务
shell> service mysqld restart
3> 修改密码
-- 第一种 ALTER USER 'chenhh'@'localhost' IDENTIFIED BY 'mypassword'; -- 第二种 SET PASSWORD FOR 'chenhh'@'localhost' = PASSWORD('mypassword'); -- 第三种 GRANT USAGE ON *.* TO 'chenhh'@'localhost' IDENTIFIED BY 'mypassword';
5. 设置MySQL用户密码过期策略
设置系统参数default_password_lifetime作用于所有的用户账户,修改my.cnf系统文件重启MySQL即可
[mysqld] default_password_lifetime=90 #default_password_lifetime=180 设置180天过期 #default_password_lifetime=0 设置密码不过期
如果为每个用户设置了密码过期策略,则会覆盖上述系统参数,设置方式如下:
-- 90天过期 ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; -- 密码不过期 ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE NEVER; -- 默认过期策略 ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE DEFAULT;
手动强制某个用户密码过期
ALTER USER 'chenhh'@'localhost' PASSWORD EXPIRE;
6. mysql 用户 lock
通过执行create user/alter user命令中带account lock/unlock子句设置用户的lock状态
Create user语句默认的用户是unlock状态
创建的时候给用户锁定方式
create user chenhh@localhost identified by 'mysql' account lock;
Alter user语句默认不会修改用户的lock/unlock状态
# 修改用户为unlock
alter user chenhh@'localhost' account unlock;
当客户端使用lock状态的用户登录MySQL时,会收到如此报错
Access denied for user ‘user_name’@’host_name’.
Account is locked.
7. 用户重命名
rename user 'chenhh'@'%' to 'zhoujielun'@'%';