MySQL用户权限管理

用户/权限管理

创建用户

创建用户通常有以下形式:

#未设定密码
create user kevin@'%';
#create 添加
#user   用户
#kevin  用户名
#%      任意主机
#设定初始密码
create user kevin@'%' identified by '123';
#指定identified by '123'为用户创建密码

注: 通过上面的形式创建的用户默认没有任何权限,如果想在创建用户的时候直接进行授权,可使用grant命令,这也是最常用的一种方法,如下代码:

GRANT ALL ON *.* TO 'root'@'localhost' identified by '123';
#创建一个名为root的用户,其主机域是localhost,其拥有 所有数据库.所有表的 ALL 全部权限,初始密码为123
GRANT INSERT,DELETE,UPDATE,SELECT ON halodb.* TO 'halo'@'localhost' identified by '123';
#创建一个名为halo的用户,其主机域是localhost,其拥有halodb库的所有表的增、删、改、查权限,初始密码为123
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'172.16.1.%' identified by 'wordpress';
#创建一个名为wordpress的用户,其主机域是172.16.1.0/24该网段的所有主机,其拥有wordpress库的所有表的所有权限,初始密码为wordpress
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'172.16.1.5%' identified by 'wordpress';
#创建一个名为wordpress的用户,其主机域是172.16.1.5%(50-59,5)该网段的所有主机,其拥有wordpress库的所有表的所有权限,初始密码为wordpress
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'172.16.1.0/255.255.255.0' identified by 'wordpress';
#创建一个名为wordpress的用户,其主机域是172.16.1.0/24该网段的所有主机,其拥有wordpress库的所有表的所有权限,初始密码为wordpress
#请注意,默认不支持前缀子网掩码的写法,也就是172.16.1.0/24这种类型,必须使用完整的子网掩码,默认语法不会报错,但没法连接
#主机名也可以作为主机域参数,主机域并不局限于IPV4风格,IPV6也被支持

删除用户

删除用户可使用DROP直接删除,如下:

#删除用户时必须跟随用户的主机域字段
DROP USER kevin@localhost;

更新用户权限

如果需要对已添加的用户的权限进行修改,可使用UPDATEuser表的数据进行更新,如下代码:

#禁止kevin用户进行删除操作,操作完成并不会立即生效,需要刷新授权表,如果是已登录的用户需要重新登陆才会生效
UPDATE mysql.user SET delete_priv='N' WHERE user='kevin' AND host='localhost';
FLUSH PRIVILEGES;
#修改任何表都可以使用此种形式

更改用户密码

忘记密码时,可以先停止mysqld进程,然后使用mysqld_safe --skip-grant-tables --skip-networking跳过授权表并禁止TCP/IP访问,然后可以使用如下几种方法进行更改密码或新增用户。

  1. 误删了msyql.user表,跳过授权表后执行以下SQL语句:

    #可以使用INSERT插入表,但是需要对表结构异常清晰,LOW法不用
    #使用GRANT添加用户并授权
    GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY '123';
    #如果执行不成功,需要先刷新授权表
    FLUSH PRIVILEGES;
    ##默认没有grant_priv权限,此root退出该模式后不能进行授权操作,故需要加上GRANT_PRIV权限
    #方法A
    FLUSH PRIVILEGES;
    UPDATE mysql.user SET grant_priv='Y' WHERE user='root' AND host='localhost';
    #方法B
    #在执行GRANT时直接加入grant_priv授权的参数GRANT OPTION,此法不用FLUASH,优选
    GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;
    
  2. 忘记了root账户或其他账户的密码,跳过授权表后执行以下SQL语句:

    #更新mysql.user表中对应用户的密码
    #比如忘记了root@localhost用户的密码
    FLUSH PRIVILEGES;
    UPDATE mysql.user SET password=PASSWORD('123') WHERE user='root' AND host='localhost';
    #更新后即可用新密码登陆,必须跳过授权表
    

授权级别

单/多库授权

通常遵循“用什么库给什么库”的原则,*.*的授权方式应避免权限越大责任越大!

#单库授予所有权限
GRANT ALL ON halodb.* TO 'halo'@'localhost' IDENTIFIED BY '12345';
#多库授权,只能查
GRANT SELECT ON *.* TO 'dev'@'localhost' IDENTIFIED BY 'abc123';
#单库授予增、改、查权限,只允许10.0.0.%段的主机连接
GRANT INSERT,UPDATE,SELECT ON test.* TO 'ops'@'10.0.0.%' IDENTIFIED BY 'test123';

单表授权

通常遵循“用什么表给什么表,要对表执行的操作”的原则,*.*的授权方式应避免权限越大责任越大!

#授予kevin@localhost只能查询mysql.user表,单表授予SELECT权限
GRANT SELECT ON mysql.user TO 'kevin'@'localhost' IDENTIFIED BY 'kevin123';
#授予kevin@10.0.0.%可以进行增、改、查
GRANT INSERT,UPDATE,SELECT ON test.messages TO 'kevin'@'10.0.0.%' IDENTIFIED BY 'keivn123';

单列授权

通常应用于金融行业等,脱离敏感信息的场合,通常我们叫做“脱敏”

#单列授权,用户kevin@10.0.0.1只能查询mysql.user表的user列
GRANT SELECT(user) ON mysql.user TO 'kevin'@'10.0.0.1' IDENTIFIED BY 'kevin123';
#多列授权增、改、查
GRANT INSERT,UPDATE,SELECT(Name,Phone) ON contact.messages TO 'kevin'@'10.0.0.%' IDENTIFIED BY 'kevin123';

注记

通常情况下,如果对同一个用户进行多次不同的授权,那么这里的权限都会起作用,相同的权限不会冲突;不同的权限会被加入,请不要使用此种授权方法!会造成权限混乱,权限这东西分配的越小风险就越低。敏感数据场合尽量使用单列授权,谨记于心!

配置优先级

如果通过/etc/init.d/mysqld脚本形式或systemctl形式启动mysqld服务,则默认会按照以下顺序载入配置文件的定义,如图:

mysql配置优先级

注: 在上图列出的顺序中,相同配置参数则最后读取的生效,不同配置参数不同文件则配置共同生效。

配置文件基本结构

my.cnf配置文件中,不同的区域对于客户端/服务端的影响不同,如下配置:

#在mysqld关键字定义的参数对于mysqld生效
[mysqld]
socket=/tmp
........
#在mysql关键字定义的参数对于mysql客户端生效
#会报错,因为服务端将socket放到了/tmp目录下
[mysql]
socket=/opt
####################下面的写法也可使用###################
#对服务端生效
[server]
........
#对客户端生效
[client]

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×