zoukankan      html  css  js  c++  java
  • mysql 用户权限管理(转)

      博主负责的项目mysql是用不同权限做的读写分离,所以装完环境后,博主就去玩mysql权限去了,然后踩坑,从坑里爬出来做点总结!

      他山之石可以攻玉,下面开始转载。

       转自:https://www.cnblogs.com/SQL888/p/5748824.html  原博主:数据帝

    mysql 用户及权限管理 小结

     

    MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用。如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接。

    在 MySQL 命令行模式下输入如下命令可以为 MySQL 创建一个新用户:

    1
    CREATE USER username IDENTIFIED BY 'password';

    新用户创建完成,但是此刻如果以此用户登陆的话,会报错,因为我们还没有为这个用户分配相应权限,分配权限的命令如下:

    1
    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';

    授予username用户在所有数据库上的所有权限。

    如果此时发现刚刚给的权限太大了,如果我们只是想授予它在某个数据库上的权限,那么需要切换到root 用户撤销刚才的权限,重新授权:

    1
    2
    EVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';
    GRANT ALL PRIVILEGES ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

    甚至还可以指定该用户只能执行 select 和 update 命令:

    1
    GRANT SELECT, UPDATE ON wordpress.* TO 'username'@'localhost' IDENTIFIED BY 'password';

    这样一来,再次以username登陆 MySQL,只有wordpress数据库是对其可见的,并且如果你只授权它select权限,那么它就不能执行delete 语句。

    另外每当调整权限后,通常需要执行以下语句刷新权限:

    1
    FLUSH PRIVILEGES;

    删除刚才创建的用户:

    1
    DROP USER username@localhost;

    仔细上面几个命令,可以发现不管是授权,还是撤销授权,都要指定响应的host(即 @ 符号后面的内容),因为以上及格命令实际上都是在操作mysql 数据库中的user表,可以用如下命令查看相应用户及对应的host:

    1
    SELECT User, Host FROM user;

    MySQL Study之--MySQL用户及权限管理
    MySQL服务器通过MySQL权限表来控制用户对数据库的访问,MySQL权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些MySQL权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
    user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
    db权限表:记录各个帐号在各个数据库上的操作权限。
    table_priv权限表:记录数据表级的操作权限。
    columns_priv权限表:记录数据列级的操作权限。
    host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

    案例分析:
    一、创建用户并授权(root用户)
    [root@mysrv ~]# mysql -u root -poracle

    mysql> select version()\g
    +-------------------------------------------+
    | version() |
    +-------------------------------------------+
    | 5.6.25-enterprise-commercial-advanced-log |
    +-------------------------------------------+
    1 row in set (0.00 sec)
    mysql> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    | prod |
    | test |
    +--------------------+
    5 rows in set (0.01 sec)


    1、建立tom用户并授权(特权管理用户)

    mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;
    Query OK, 0 rows affected (0.00 sec)

    查看用户创建是否成功:
    mysql> select user,host from user ;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +-------+-----------+
    | user  | host      |
    +-------+-----------+
    | tom   | %         |
    | root  | 127.0.0.1 |
    | root  | ::1       |
    |       | localhost |
    | root  | localhost |
    | scott | localhost |
    |       | mysrv     |
    | root  | mysrv     |
    +-------+-----------+
    8 rows in set (0.00 sec)

    查看tom用户的授权:
    mysql> show grants for tom;
    +----------------------------------------------------------------------------------------------------+
    | Grants for tom@% |
    +----------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
    | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
    +----------------------------------------------------------------------------------------------------+

    GRANT 语法:
    GRANT privileges (columns)
    ON what
    TO user IDENTIFIED BY "password"
    WITH GRANT OPTION


    权限列表:
    ALTER: 修改表和索引。
    CREATE: 创建数据库和表。
    DELETE: 删除表中已有的记录。
    DROP: 抛弃(删除)数据库和表。
    INDEX: 创建或抛弃索引。
    INSERT: 向表中插入新行。
    REFERENCE: 未用。
    SELECT: 检索表中的记录。
    UPDATE: 修改现存表记录。
    FILE: 读或写服务器上的文件。
    PROCESS: 查看服务器中执行的线程信息或杀死线程。
    RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
    SHUTDOWN: 关闭服务器。
    ALL: 所有权限,ALL PRIVILEGES同义词。
    USAGE: 特殊的 "无权限" 权限。
    用 户账户包括 "username" 和 "host" 两部分,后者表示该用户被允许从何地接入。tom@'%' 表示任何地址,默认可以省略。还可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。数据库格式为 db@table,可以是 "test.*" 或 "*.*",前者表示 test 数据库的所有表,后者表示所有数据库的所有表。
    子句 "WITH GRANT OPTION" 表示该用户可以为其他用户分配权限。 


    2、我们用 root 再创建几个用户,然后由 test 数据库的管理员tom为他们分配权限。

    mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2';
    Query OK, 0 rows affected (0.00 sec)

    mysql> select user,host from user ;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    +-------+-----------+
    | user  | host      |
    +-------+-----------+
    | tom   | %         |
    | tom1  | %         |
    | tom2  | %         |
    | root  | 127.0.0.1 |
    | root  | ::1       |
    |       | localhost |
    | root  | localhost |
    | scott | localhost |
    |       | mysrv     |
    | root  | mysrv     |
    +-------+-----------+
    10 rows in set (0.00 sec)

    root用户退出,tom登陆,并授权用户访问prod库

    [root@mysrv ~]# mysql -u tom -ptom 
    ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)

    tom用户竟不能登陆!!!

    再对tom用户授权:
    mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;;
    Query OK, 0 rows affected (0.00 sec)

    mysql> show grants for tom;
    +----------------------------------------------------------------------------------------------------+
    | Grants for tom@% |
    +----------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
    | GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
    +----------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    mysql> use mysql;
    Database changed
    mysql> select user,host from user ;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    +-------+-----------+
    | user  | host      |
    +-------+-----------+
    | tom   | %         |
    | tom1  | %         |
    | tom2  | %         |
    | root  | 127.0.0.1 |
    | root  | ::1       |
    |       | localhost |
    | root  | localhost |
    | scott | localhost |
    | tom   | localhost |
    |       | mysrv     |
    | root  | mysrv     |
    +-------+-----------+
    11 rows in set (0.00 sec)

    tom登陆:
    [root@mysrv ~]# mysql -u tom -ptom prod
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | prod |
    +------------+
    1 row in set (0.01 sec)

    mysql> select current_user();
    +----------------+
    | current_user() |
    +----------------+
    | tom@localhost |
    +----------------+
    1 row in set (0.00 sec)

    创建表:

    mysql> show tables;
    +----------------+
    | Tables_in_prod |
    +----------------+
    | t1 |
    +----------------+
    1 row in set (0.00 sec)

    mysql> create table t2 as select * from t1;
    Query OK, 3 rows affected (0.15 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    查看表信息:

    mysql> desc t2;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id | int(11) | YES | | NULL | |
    | name | varchar(10) | YES | | NULL | |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.01 sec)

    mysql> show create table t2;
    +-------+---------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+---------------------------------------------------------------------------------------------------------------------------+
    | t2 | CREATE TABLE `t2` (
    `id` int(11) DEFAULT NULL,
    `name` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    +-------+---------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)

    mysql> show create table t2\G;
    *************************** 1. row ***************************
    Table: t2
    Create Table: CREATE TABLE `t2` (
    `id` int(11) DEFAULT NULL,
    `name` varchar(10) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)

    mysql> select * from t2;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    +------+-------+
    3 rows in set (0.00 sec)

    3、tom用户为tom1,tom2授权
    mysql> grant select on prod.* to tom1;
    Query OK, 0 rows affected (0.00 sec)

    mysql> grant select on prod.* to tom2;
    Query OK, 0 rows affected (0.02 sec)

    mysql> grant insert,update on prod.* to tom2;
    Query OK, 0 rows affected (0.00 sec)

    tom2登陆(从远程登陆):

    C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2

    mysql> select database();
    +------------+
    | database() |
    +------------+
    | NULL |
    +------------+
    1 row in set (0.00 sec)

    mysql> use prod;
    Database changed
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | prod |
    +------------+
    1 row in set (0.00 sec)

    mysql> select current_user();
    +----------------+
    | current_user() |
    +----------------+
    | tom2@% |
    +----------------+
    1 row in set (0.00 sec)

    mysql> show grants for tom2;
    +------------------------------------------------------------------+
    | Grants for tom2@% |
    +------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'tom2'@'%' IDENTIFIED BY PASSWORD |
    | GRANT SELECT, INSERT, UPDATE ON `prod`.* TO 'tom2'@'%' |
    +------------------------------------------------------------------+
    2 rows in set (0.00 sec)

    mysql> show tables;
    +----------------+
    | Tables_in_prod |
    +----------------+
    | t1 |
    | t2 |
    +----------------+
    2 rows in set (0.00 sec)

    mysql> select * from t1;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    +------+-------+
    3 rows in set (0.00 sec)

    mysql> select * from t2;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    +------+-------+
    3 rows in set (0.00 sec)

    mysql> insert into t1 values (40,'john');
    Query OK, 1 row affected (0.00 sec)
    mysql> commit;
    Query OK, 0 rows affected (0.09 sec)

    mysql> select * from t1;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    | 40 | john |
    +------+-------+
    4 rows in set (0.00 sec)

    mysql> update t1 set name='ellen' where id=40;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> select * from t1;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    | 40 | ellen |
    +------+-------+
    4 rows in set (0.00 sec)

    mysql> delete from t1;
    ERROR 1142 (42000): DELETE command denied to user 'tom2'@'192.168.8.254' for tab
    le 't1'
    mysql> commit;
    Query OK, 0 rows affected (0.05 sec)

    mysql> select * from t1;
    +------+-------+
    | id | name |
    +------+-------+
    | 10 | tom |
    | 20 | jerry |
    | 30 | rose |
    | 40 | ellen |
    +------+-------+
    4 rows in set (0.00 sec)


    4、回收tom2的update权限:
    mysql> revoke update on prod.* from tom2;
    Query OK, 0 rows affected (0.00 sec)

    tom2再重新登陆:
    C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2

    mysql> use prod;
    Database changed
    mysql> update t1 set name='lily' where id=10;
    ERROR 1142 (42000): UPDATE command denied to user 'tom2'@'192.168.8.254' for tab
    le 't1'
    ---update失败!

    二、修改用户口令:

    1、root用户修改普通用户口令
    mysql> set password for tom1=password('oracle');
    Query OK, 0 rows affected (0.01 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    tom1重新登陆:
    C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1
    Warning: Using a password on the command line interface can be insecure.
    ERROR 1045 (28000): Access denied for user 'tom1'@'192.168.8.254' (using passwor
    d: YES)
    ---旧口令登陆失败!

    C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle
    mysql>

    2、普通用户修改自己密码:
    C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle
    mysql> set password=password('tom1');
    Query OK, 0 rows affected (0.00 sec)

    重新登陆:
    C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1

    mysql>
    ---新密码登陆成功 !

    三、删除用户:
    1、回收用户所有权限
    mysql> revoke all on prod.* from tom2;
    Query OK, 0 rows affected (0.01 sec)

    2、删除用户
    mysql> drop user tom2;
    Query OK, 0 rows affected (0.00 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    mysql> select user,host from user;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    +-------+-----------+
    | user  | host      |
    +-------+-----------+
    | jerry | %         |
    | rose  | %         |
    | tom   | %         |
    | tom1  | %         |
    | root  | 127.0.0.1 |
    | root  | ::1       |
    |       | localhost |
    | jerry | localhost |
    | root  | localhost |
    | rose  | localhost |
    | scott | localhost |
    | tom   | localhost |
    |       | mysrv     |
    | root  | mysrv     |
    +-------+-----------+
    14 rows in set (0.00 sec)

    ------- 摘要 -------------------------------------- 

    创建用户:
    GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
    CREATE USER user2 IDENTIFIED BY 'password';
    分配权限:
    GRANT select ON testdb.* TO user2;
    查看权限:
    SHOW GRANTS FOR user1;
    修改密码:
    SET PASSWORD FOR user1 = PASSWORD('newpwd');
    SET PASSWORD = PASSWORD('newpwd');
    移除权限:
    REVOKE all ON *.* FROM user1;
    删除用户:
    DROP USER user1;
    数据库列表:
    SHOW DATABASES;
    数据表列表:
    SHOW TABLES;
    当前数据库:
    SELECT DATABASE();
    当前用户:
    SELECT USER();
    数据表结构:
    DESCRIBE table1;
    刷新权限:
    FLUSH PRIVILEGES;

    grant和revoke可以在几个层次上控制访问权限
    1,整个服务器,使用 grant ALL 和revoke ALL
    2,整个数据库,使用on database.*
    3,特点表,使用on database.table
    4,特定的列
    5,特定的存储过程

    user表中host列的值的意义
    % 匹配所有主机
    localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
    127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
    ::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1

    grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
    grant select on testdb.* to common_user@’%’
    grant insert on testdb.* to common_user@’%’
    grant update on testdb.* to common_user@’%’
    grant delete on testdb.* to common_user@’%’
    或者,用一条 MySQL 命令来替代:
    grant select, insert, update, delete on testdb.* to common_user@’%’
    grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
    grant 创建、修改、删除 MySQL 数据表结构权限。
    grant create on testdb.* to developer@’192.168.0.%’;
    grant alter on testdb.* to developer@’192.168.0.%’;
    grant drop on testdb.* to developer@’192.168.0.%’;
    grant 操作 MySQL 外键权限。
    grant references on testdb.* to developer@’192.168.0.%’;
    grant 操作 MySQL 临时表权限。
    grant create temporary tables on testdb.* to developer@’192.168.0.%’;
    grant 操作 MySQL 索引权限。
    grant index on testdb.* to developer@’192.168.0.%’;
    grant 操作 MySQL 视图、查看视图源代码 权限。
    grant create view on testdb.* to developer@’192.168.0.%’;
    grant show view on testdb.* to developer@’192.168.0.%’;
    grant 操作 MySQL 存储过程、函数 权限。
    grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status
    grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure
    grant execute on testdb.* to developer@’192.168.0.%’;
    grant 普通 DBA 管理某个 MySQL 数据库的权限。
    grant all privileges on testdb to dba@’localhost’
    其中,关键字 “privileges” 可以省略。
    grant 高级 DBA 管理 MySQL 中所有数据库的权限。
    grant all on *.* to dba@’localhost’

    MySQL grant 权限,分别可以作用在多个层次上。
    1. grant 作用在整个 MySQL 服务器上:
    grant select on *.* to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
    grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
    2. grant 作用在单个数据库上:
    grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
    3. grant 作用在单个数据表上:
    grant select, insert, update, delete on testdb.orders to dba@localhost;
    4. grant 作用在表中的列上:
    grant select(id, se, rank) on testdb.apache_log to dba@localhost;
    5. grant 作用在存储过程、函数上:
    grant execute on procedure testdb.pr_add to ’dba’@’localhost’
    grant execute on function testdb.fn_add to ’dba’@’localhost’

    注意:修改完权限以后 一定要刷新服务,或者重启服务,刷新服务用:FLUSH PRIVILEGES。

    以上为原博内容,未做任何修改。

      来来来,博主给划重点,修改完权限一定要刷新:

      flush privileges!

      flush privileges!!

      flush privileges!!!

      重点说3遍养成好习惯!

      然后说一下博主遇到的坑,上面博文里还有一个重点内容,与博主遇到的问题相关:

      这个权限结构要多注意一下,user->db->... 

      博主当时想要建一个只有读权限的账号

      grant select on testdb.* to common_user@’%’

      然后发现这个账号连上后不但能读还能增删改查删表格,博主很懵逼,难道装了个假的mysql?开始各种查博客,终于发现原因。

      原来博主连的是 mysql自带的 test 数据库(中间博主怀疑过数据库的问题新建了 test_11库),博主在mysql.user 表里给了只读权限,但是mysql.db表没有注意

      给大家看看mysql.db表里的默认数据:

      

      这两行user的限制是空的,意思是在这种test库或者test前缀的库,用户权限是不受限制的,即使在user表里的权限设置好,也是以db的限制为准。

      机智的博主删掉了这两行,一切ok。

      总结,博主没有仔细看别人的文章,然后机缘巧合,中了连环套。

      最后感谢另一个博主的文章,附一下连接:https://blog.csdn.net/hsd2012/article/details/51242993

      

     

  • 相关阅读:
    Ajax | Form 上传图片文件
    .NET Core 上传图片到七牛云
    限制input输入框只能输入 数字
    MySql操作命令创建学生管理系统
    大数据之kafka-05.讲聊聊Kafka的版本号
    大数据之kafka-02.搞定kafka专业术语
    消息队列的作用以及kafka和activemq的对比
    .Net Core 3.1迁移整理
    RabbitMQ的使用
    .NET Framework 项目多环境下配置文件web.config
  • 原文地址:https://www.cnblogs.com/jwcrxs/p/8693904.html
Copyright © 2011-2022 走看看