mysql 数据库用户管理与授权
目录create user '用户名'@‘登录地址' [ identitified by '密码' ];
select password('密码');
create user ’用户名'@‘登录地址’ identified by '加密密文';
用户名:指定将创建的用户名
登录地址:指新创建的用户可以从哪里登录数据库。可以适应 ip 地址,网段,主机名,本地用户为localhost,任意主机都可以登录为’%‘
密码:
(1)若使用明文面,则直接输入。如果要使用加密密码则下使用select password('密码') ;获取密文,再在语句中添加password '密文';
(2) 如果省略 'identified by' 部分,则用户的密码将为空
#显示当前登录用户与登录地点 select user(); #明文创建本地登录用户test ,并设置密码abc123 create user 'test'@'localhost' identified by 'abc123'; #密文创建用户 #先查看密码 abc123 的加密密码 select password('abc123'); #在使用加密后的密码,创建本地登录用户test2 create user 'test2'@'localhost' identified by password '*6691484EA6B50DDDE1926A220DA01FA9E575C18A';
select * from mysql.user \G
select User,Host,authentication_string from mysql.user;
mysql 数据库用户信息保存在mysql 库 的user表中,包括了用户名,用户登录地点,用户权限,用户密码加密密文等。其中 User 项保存了用户名,Host 项保存了用户登录地点,autentication_string 保存了用户密码加密密文
select user,host,authentication_string from mysql.user;
rename user '用户名'@‘登录地点’ to '新用户名'@'新登录地点';
'用户名'@'登录地点' 必须时存在的。
#将本地登录的用户test2 该文任意地点都可以登录的用户test rename user 'test2'@'localhost' to 'test'@'%';
drop user '用户名'@'客户端登录地址';
删除用户必须要有管理员权限才可以。
如果不加 @'客户端登录地址', 相当于删除 '用户名'@'%'\
并且,用户名和登录地址要对应
#删除任意主机登录的用户 ’test‘@'%'.相当于 drop user t 'test'@'%' drop user 'test'; #删除本地登录的用户test drop user 'test'@'localhost' ;
set password=password('新密码');
set password for '用户名'@'登录地点'=password('密码新');
update mysql.user set authentication_string=password('新密码') where 条件表达式;
#设置当前登录用户密码为 123456 set password=password('123456'); #设置本地登录的root 用户密码为 abc123 set password for 'root'@'localhost'=password('abc123'); #修改mysql.user 表的 user字段值为 'user2' 的表记录,将它的authentication_string 字段值改为加密后的123456 #也就是修改 所有 用户名为 user2 的用户的密码为123456 update mysql.user set authentication_string=password('123456') where user='user2';
我们可以通过配置文件中myseld 设置的 skip-grant-table'项来跳过授权表,匿名登录。然后修改 mysql 库user表中root 的authentication 字段,来修改root密码。
vim /etc/my.conf [mysqld] skip-grant-tables #在[mysqd] 项中添加 skip-grant-table 跳过授表
systemctl restart mysqld #重启mysql的服务 mysql #匿名进入mysql # 通过修改 mysql.usr 的authentication_string 字段,来修改 'root'@'locathost' 用户的密码 update mysql.user set authentication_string=password('abc123') where user='root' and host='localhost'; #刷新授权表 flush privileges; #退出匿名登录 exit
vim /etc/my.cnf [mysqld] #将 skip-grant-tables 删除 #skip-grant-tables #重启mysqld 服务 systemctl restart mysqld #使用root 登录进入数据库 mysql -uroot -pabc123 #查看当前登录用户与登录地址 select user();
我们使用create user 创建的用户,只能登录进入数据库,但是无法做任何事情。
所以还需要grant 命令进行 用户授权。同时,此命令,如果当用户不存在,也可以创建该用户。
grant 权限列表 on 数据库名.表名 to '用户名'@'来源地址' identified by ‘密码’ with grant option;
权限列表:多个权限用逗号‘,’ 隔开,如 'select,update' 。 all 表示所有权限
数据库名.表名:用于指定授权操作的数据库名和表名,可以使用通配符' *' 表示所有。如 *.* 表示所有库,所有表
'用户名'@'来源地址' : 用户指定用户名和可以登录的客户端地址。可以使用百分号 % 来表示某个区域的所有地址。 'root'@'%' 表示任意主机都可以登录, 'root'@'192.168.23.%' 表示192.168.23.0 整个网段。'root'@'%.mynet.com' 表示所有以.mynet.com 结尾的主机
identified by :用于设置用户连数据库时候的密码。在新建用户时,如果省略此部分,则用户密码为空。但是我们在配置文件中设置了'NO_AUTO_CREATE_USER'项,所以时无法创建空密码用户
with grant option :让被授权的用户,可以将相同的权限授权给他人。
其他事项:grant 授权或者 revoke 撤销权限后,需要用户重新连接mysql 数据库,或者刷新授权表
#授权 school库 的所有表的select权限给用户 test,登录密码是abc123,只能本地登录 grant select on school.* to 'test'@'localhost' identified by 'abc123'; exit #退出数据库 #使用用户 test ,密码abc123 本地登录nmysql mysql -utest -pabc123 #查看数据库 show databases; #切换到 school库 use school #尝试向表中插入数据,结果为权限被拒绝 insert into class1 value(10,'test',1010110);
注意,当被授权用户将权限授予他人时候,涉及到的权限,库,表,必须时本身拥有的权限。否则报错。
比如,当本身没有mysql 库的权限时,就不可以在授权给其他用户时加上密码。
#将school库的所有表的select,insert,update,delete 权限授权给使用密码 abc123本地登录的用户test,并且,该用户可以将这些权限授权给其他用户 grant select,insert,update,delete on school.* to 'lisi'@'localhost' -> identified by 'abc123' with grant option; #刷新授权表 flush privileges; exit
#当将权限授权于给一个不存在的用于时,则报错,不可以使用grant 命令创建用户 grant select,update,insert,delete on school.* to 'wangwu'@'localhost' identified by 'abc123'; #当授权个一个存在的用户,但是后面跟了 identified by 项时,则报错,不可以对mysql 库操作。因为用户密码是保存在 mysql 库中,而当前用户没有mysql 库的权限,所以报错。 #可以授权时候,后面不跟密码,或者将mysql 库user表的相应权限授权给 当前用户 grant select,update,insert,delete on school.* to 'test'@'localhost' identified by 'abc123'; #当直接授权给存在的用户'test'@'localhost'时,则成功。 grant select,update,insert,delete on school.* to 'test'@'localhost' ;
#使用test 用户本地登录 mysql -utest -pabc123 use school; #本来没有insert 权限的test用户,现在可以对class1 表进行增删改查操作 insert into class1 values(13,'test',13131113);
用户显示自身的访问权限
show grants;
管理员查看已拥有授权用户权限
show grants for '用户名'@'登录地点'
#显示当前登录用户的权限 show grants; #显示'test'@'localhost' 用户的权限 show grants for 'test'@'localhost';
revoke 权限 on 库名.表名 from '用户名'@'登录地点' ;
权限,库名.表名, '用户名'@'登录地点' 必须与授权表里对应
all 表示所有权限
revoke select on school.* from 'test'@'localhost'; revoke all on school.* from 'test'@'localhost';