用户权限管理
在不同的项目中给不同的角色(开发者)不同的操作权限,为了保证数据库数据的安全
通常,一个用户的密码不会长期不变,所以需要经常性的变更数据库用户密码来确保用户本身安全
用户管理
MySQL
需要客户端进行连接认证才能进行服务器操作:需要用户信息,MySQL
中所有的用户信息都是保存在MySQL
数据库下的user
表中
select * from mysql.user \G;
默认的,在安装MySQL
的时候,如果不选择匿名用户,那么意味着所有的用户只有一个:root
在MySQL
中,对用的用户管理中,是由对应的host
和user
共同组成主键来区分用户。
user
:代表用户的用户名
host
:代表的本质是允许访问的客户端(IP或者主机地址)。如果host
为%
则代表所有客户端都可以访问。
创建用户
理论上讲可以采用两种方式创建用户
-
直接使用
root
用户在mysql.user
表中插入记录(不推荐) -
专门创建用户的
SQL
指令基本语法:
create user 用户 identified by 密码;
用户:用户名@主机地址
如果不限制主机地址则用
%
代替create user 'user1'@'%' identified by '123456';
删除用户
注意:MySQL
中user
是带着host
本身的(具有唯一性)
基本语法:drop user 用户名@host;
drop user user1@'%'
修改用户密码
MySQL
中提供了多种修改密码的方式:基本上都必须使用对应提供的一个系统函数:password()
,需要靠该函数对密码进行加密处理。
-
使用专门修改密码的指令
基本语法:
alter user 用户 identified by '新的密码';
alter user 'user1'@'%' identified by '654321'
权限管理
在MySQL
中将权限管理分为三类
- 数据权限:增删改查(
select``update``insert``delete
) - 结构权限:结构操作(
create``drop
) - 管理权限:权限管理(
create user``grant``revoke
)这个权限通常只给管理员
授予权限:grant
将权限分配给指定的用户。
基本语法:grant 权限列表 on 数据库.表名 to 用户
权限列表:用逗号分隔,但是可以用all privileges
代表所有权限
数据库.表名:可以是单表(数据库.表名
),可以是具体某个数据库(数据库.*
),也可以是整库(*.*
)
grant select on mydb.my_student to 'user1'@'%';
取消权限:revoke
权限回收:将权限从用户手中收回
基本语法:revoke 权限列表 on 数据库.表名 from 用户
revoke all privileges on mydb.my_student from 'user1'@'%';
刷新权限:flush
将当前对用户的权限操作,进行一个刷新,将操作的具体内容同步到对应的表中。
基本语法:flush privileges
密码丢失的解决方案
如果忘记了root
用户密码,就需要去找回或者重制密码
-
停止服务(也可在preference中关闭)
-
重启服务
sudo mysqld_safe --skip-grant-tables
// 启动服务器但是跳过权限 -
此时
MySQL
服务器端已经启动,不过当前的服务器没有权限概念:非常危险,任何客户端,不需要任何用户信息都可以直接登录,而且是root
权限。
-
修改
root
用户的密码:指定用户名@host
use mysql; flush privileges; alter user 'root'@'localhost' identified with mysql_native_password by '87654321';
-
关闭此时的服务器,并重启服务
sudo /usr/local/mysql/support-files/mysql.server stop sudo /usr/local/mysql/support-files/mysql.server start