MySQL用户和权限的管理

MySQL用户信息存在mysql.user表中
查看当前所在的数据库select database();
查看用户的信息
进入数据库之后直接查看,如果已经切换到其他库里面不能查看到用户的信息
mysql> select user,host,password from mysql.user;
+--------+--------------+-------------------------------------------+
| user   | host         | password                                  |
+--------+--------------+-------------------------------------------+
| root   | localhost    |                                                                    |
| root   | mysql         |                                           |
| root   | 127.0.0.1    |                                           |
| root   | ::1              |                                           |
|          | localhost                   |          |
|          | localhost.localdomain |          |
+--------+--------------+-------------------------------------------+
mysql> drop user [email protected]'ula.example.com';
mysql> delete from mysql.user where user!='root';

注(问题一):使用delete命令进行删除用户的时候,再次创建已经使用delete命令删除的用户的时候会出现错误;解决办法就是使用drop命令进行重新删除该用户然后在继续创建。(文章后面有问题一的解决办法)
创建用户
创建无密码无限制登录IP的账户
create user 'xiaomi';
创建本地用户并设置密码
create user [email protected] identified by 'xiao';创建用户名xiao在哪一台主机上面可以使用指定密码'xiao'登录mysql数据库
创建可以远程登录的用户
远程登录的该主机的ip地址:192.167.1.1
1)创建远程用户
语法:create user 用户名@可以登陆的主机ip identified by '密码字符串';
mysql> create user [email protected] identified by '88';
Query OK, 0 rows affected (0.00 sec)
'192.168.1.%' 表示192.168.1网段,在创建用户时必须加上''将网段引起来,否则的话创建用户的命令无法识别%的符号
'%'表示用户可以从任何地址进行访问在此处%的作用有点那类似与shell里面的*号通配符
例:提供一个可以远程登录的用户叫apple允许192.168.1网段的主机使用apple用户访问你的mysql数据库
mysql> create user [email protected]'192.168.1%' identified by 'apple';
客户端登录服务器:
语法:mysql -u 用户名 -h 服务器的IP地址 -p密码
创建的新用户,需要进行授权才能查看主机用户创建的数据库,无论是创建的本地用户还是远程登录用户都需要进行授权才能够使用数据库。
例:mysql -u remote -h 192.168.1.1 -p88
如果remote用户能够通过192.168.1.1主机远程登录到数据库,那么就说明远程用户创建成功
权限
    全局层级
        全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。
        
    数据库层级
        数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。
        
    表层级
        表权限适用于一个给定的表中的所有列。这些权限存储在mysql.tables_priv表中。
        
    列层级
        列权限适用于一个给定的表中的单一列。这些权限存储在mysql.columns_priv表中。
        
授权  grant
    语法:grant 权限列表 on 库名.表名 to 用户@主机 identified by '密码字符串';
    
    权限列表
        alter
        create
        delete
        drop
        index
        insert
        select
        update
        file   读或写服务器上的文件
        all  所有权限
        show databases 

 1)授全部权限
        MariaDB [(none)]> grant all on *.* to [email protected] identified by 'test';          #all表示所有权限;*.*表示所有的库和所有的表
        MariaDB [(none)]> select * from mysql.user\G;
        MariaDB [(none)]> flush privileges;             #刷新权限
      如果给用户授权时授权的密码与用户的登录密码相冲突的时候,原密码会失效,使用授权密码才能够登录Mysql数据库并拥有相应的授权权限;
    2)授部分权限
        1.zhangqi 查询 插入 更新 数据库test中所有表数据的权限。
            MariaDB [(none)]> grant select,insert,update on test.* to [email protected]'192.168.1.%' identified by 'zhangqi';
            Query OK, 0 rows affected (0.00 sec)

            MariaDB [(none)]> flush privileges;
            Query OK, 0 rows affected (0.00 sec)
                
            MariaDB [(none)]> select * from mysql.db where user='zhangqi'\G;
   
        2.给数据库开发人员xiaoli 创建表 索引 权限
            MariaDB [(none)]> grant create,index on *.* to [email protected]'192.168.1.71'  identified by 'xiaoli';       index 为索引权限
            Query OK, 0 rows affected (0.00 sec)

            MariaDB [(none)]> flush privileges;
            Query OK, 0 rows affected (0.00 sec)
        
            MariaDB [(none)]> select * from mysql.user where user='xiaoli'\G;
       3.给root_test用户查看mysql.user表的权限
            MariaDB [(none)]> grant select on mysql.user to root_test identified by 'root_test';
            Query OK, 0 rows affected (0.00 sec)

            MariaDB [(none)]> flush privileges;
            Query OK, 0 rows affected (0.00 sec)

            MariaDB [(none)]> select * from mysql.tables_priv where user='root_test'\G;

        4.给root_test1用户只可以查看mysql.user user和host列的权限
            MariaDB [(none)]> grant select(user,host) on mysql.user  to root_test1 identified by 'root_test1';
        
            MariaDB [(none)]> flush privileges;
            Query OK, 0 rows affected (0.00 sec)
查看权限
    查看当前用户自己的权限
        MariaDB [(none)]> show grants;

    查看其他用用户权限
        MariaDB [(none)]> show grants for 用户名@主机名(或是登录ip);
        
授权经验原则    
        权限控制主要出于安全考虑,因此需要遵循一个几个经验原则
        1.只授予能满足需要的最小权限,防止用户干坏事。比如说用户只是需要查询,那就只给select权限就可以了。不要给用户赋予update,insert或者delete。
        2.创建用户的时候限制用户的登陆主机
        3.初始化数据库的时候删除没有密码的用户。
        4.为每个用户设置满足密码复杂度的密码
        5.定期清理不需要的用户。回收权限或者删除用户
        
回收权限
    语法:
        revoke 权限 on 库名.表名 from 用户@主机;
        MariaDB [(none)]> revoke all on *.*  from  [email protected]'%';   #回收全部权限
        MariaDB [(none)]> revoke insert on *.*  from  [email protected]'%';   #回收部分权限
    
        删除用户
        MariaDB [(none)]> delete from mysql.user where user!='root';

修改密码
    1.使用mysqladmin命令
        # mysqladmin -u root -p123 password '456'
    
    2.使用set password命令
        MariaDB [(none)]> set password for 'root'@'localhost'=password('1');

    3.使用update直接编辑user表
        MariaDB [(none)]> update mysql.user set password=password('2') where user='root' and host='localhost';
        MariaDB [(none)]> flush privileges;
也可以修改对应的权限表,来改变权限
========================================
全局权限: mysql.user
    > grant select on *.* to [email protected]'%' identified by '123';
库级权限: mysql.db
    > grant select on db1.* to [email protected]'%' identified by '123';
表级权限: mysql.tables_priv
    > grant all on db1.t1 to [email protected]'%' identified by '123';
列级权限: mysql.columns_priv
    > grant select(class) update(class) on db1.class to [email protected]'%' identified by '123';            (class)列名
    lilei用户只能查看和更新 db1库,class表中的class列的的内容

 

问题一:
使用delete命令删除用户的时候再次创建使用delete删除mysql.user表里面的用户的时候会出现错误

MySQL用户和权限的管理

解决办法:使用drop命令重新删除用户,就可以直接创建了。

MySQL用户和权限的管理