MySQL 用户与权限管理

MySQL权限系统的主要功能是证实连接到一台给定主机的用户,而且赋予该用户在数据库上的相关DML,DQL权限。MySQL存取控制包括2个阶段,一是server检查是否同意你连接;二是假定你能连接,server检查你发出的每一个请求。看你是否有足够的权限实施它。

本文主要描写叙述MySQL权限系统相关的用户创建、授权、撤销权限等等。

1、获取有关权限管理的帮助

[email protected][(none)]> help Account Management
For more information, type ‘help <item>‘, where <item> is one of the following
topics:
You asked for help about help category: "Account Management"
   CREATE USER
   DROP USER
   GRANT
   RENAME USER
   REVOKE
   SET PASSWORD

2、创建mysql数据库用户

--创建用户的语法
[email protected][(none)]> help create user;
Name: ‘CREATE USER‘
Description:
Syntax:
CREATE USER user_specification [, user_specification] ...

user_specification:
    user
    [
      | IDENTIFIED WITH auth_plugin [AS ‘auth_string‘]
        IDENTIFIED BY [PASSWORD] ‘password‘
    ]

create user命令会创建一个新帐户,同一时候也能够为其指定password。该命令将加入一条记录到user表。
该命令只授予usage权限。

须要再使用grant命令进行进一步授权。也能够使用grant命令直接来创建账户见兴许的相关演示。
以下是mysql官方手冊对usage的解释。

The USAGE privilege specifier stands for “no privileges.” It is used at the global level with
GRANT to modify account attributes such as resource limits or SSL characteristics without affecting
existing account privileges.

--当前演示环境
[email protected][(none)]> show variables like ‘version‘;
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.5.39-log |
+---------------+------------+

--创建新用户(未指定password)
[email protected][(none)]> create user ‘fred‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

--指定password创建新用户,%表示随意,即frank能够从随意主机訪问数据库
[email protected][(none)]> create user ‘frank‘@‘%‘ identified by ‘frank‘;
Query OK, 0 rows affected (0.00 sec)

--查看刚刚加入的账户
[email protected][(none)]> select host,user,password from mysql.user where user like ‘fr%‘;
+-----------+-------+-------------------------------------------+
| host      | user  | password                                  |
+-----------+-------+-------------------------------------------+
| %         | frank | *63DAA25989C7E01EB96570FA4DBE154711BEB361 |
| localhost | fred  |                                           |
+-----------+-------+-------------------------------------------+

3、使用grant授予权限

--grant命令语法
[email protected][mysql]> help grant
Name: ‘GRANT‘
Description:
Syntax:
GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user_specification [, user_specification] ...
    [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]
    [WITH with_option ...]

GRANT PROXY ON user_specification
    TO user_specification [, user_specification] ...
    [WITH GRANT OPTION]

object_type:
    TABLE
  | FUNCTION
  | PROCEDURE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name

user_specification:
    user
    [
      | IDENTIFIED WITH auth_plugin [AS ‘auth_string‘]
        IDENTIFIED BY [PASSWORD] ‘password‘
    ]

怎样授权
  a、须要指定授予哪些权限
  b、权限应用在那些对象上(全局,特定对象等)
  c、授予给哪个帐户
  d、能够指定password(可选项,用此方式会自己主动创建用户)

授权权限的范围:
  ON *.*
  ON  db_name.*
  ON  db_name.table_name
  ON  db_name.table_name.column_name
  ON  db_name.routine_name

--权限一览表,我们直接查询root账户全部的权限,例如以下
--mysql的权限相对于oracle而言,相对简单,并且也没有涉及到角色方面的定义与配置
[email protected][(none)]> select * from mysql.user where user=‘root‘ and host=‘localhost‘\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password:
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin:
 authentication_string:
1 row in set (0.00 sec)

--说明,本文中描写叙述的mysql提示符为[email protected][(dbname)],不同的帐户,不同的主机登录会显示不同。
--其次。不同的提示符下所代表的用户身份及权限。
--查看当前的连接用户
[email protected][(none)]> select current_user();
+----------------+
| current_user() |
+----------------+
| [email protected] |
+----------------+

--查看当前帐户的权限
[email protected][(none)]> show grants;  --该账户用于最高权限,带有WITH GRANT OPTION
+---------------------------------------------------------------------+
| Grants for [email protected]                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘localhost‘ WITH GRANT OPTION |
| GRANT PROXY ON ‘‘@‘‘ TO ‘root‘@‘localhost‘ WITH GRANT OPTION        |
+---------------------------------------------------------------------+

suse11b:~ # mysql -ufred -p
Enter password: 

[email protected][(none)]> show grants;
+------------------------------------------+
| Grants for [email protected]                |
+------------------------------------------+
| GRANT USAGE ON *.* TO ‘fred‘@‘localhost‘ |
+------------------------------------------+

--以下使用root账户给fred赋予权限all privileges
[email protected][(none)]> grant all privileges on *.* to ‘fred‘@‘localhost‘;
Query OK, 0 rows affected (0.01 sec)

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

[email protected][(none)]> show grants;
+---------------------------------------------------+
| Grants for [email protected]                         |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘fred‘@‘localhost‘ |
+---------------------------------------------------+

[email protected][(none)]> use tempdb

[email protected][tempdb]> create table tb_isam(id int,value varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.10 sec)

[email protected][tempdb]> insert into tb_isam values (1,‘jack‘),(2,‘robin‘);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

[email protected][tempdb]> commit;

--以下的授权收到了错误提示。不能授权
[email protected][tempdb]> grant select on tempdb.* to ‘frank‘@‘%‘;
ERROR 1044 (42000): Access denied for user ‘fred‘@‘localhost‘ to database ‘tempdb‘

--以下从root session来给之前创建的frank授权
--授予frank在数据库tempdb上全部对象的select权限
[email protected][(none)]> grant select on tempdb.* to ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

--更新cache中的权限
[email protected][(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

--从另外的主机使用frank账户登录
suse11a:~ # mysql -ufrank -p -h172.16.6.89
Enter password: 

--此时frank。此时已经能够訪问了tempdb上的表tb_isam
[email protected][(none)]> select * from tempdb.tb_isam;
+------+-------+
| id   | value |
+------+-------+
|    1 | jack  |
|    2 | robin |
+------+-------+

[email protected][(none)]> show grants;
+------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘frank‘@‘%‘ IDENTIFIED BY PASSWORD ‘*63DAA25989C7E01EB96570FA4DBE154711BEB361‘ |
| GRANT SELECT ON `tempdb`.* TO ‘frank‘@‘%‘          --能够看到多出了select权限                         |
+------------------------------------------------------------------------------------------------------+

--以下是一个授予最大权限的样例。授予的同一时候会自己主动创建用户,因为我们没有设置密码,所以password列查询结果为空
[email protected][(none)]> grant all privileges on *.* to ‘jack‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)    --第一个*号代表随意数据库。第二个*号代表数据库上的随意对象

[email protected][(none)]> select user,host,Password from mysql.user where user=‘jack‘;
+------+-----------+----------+
| user | host      | Password |
+------+-----------+----------+
| jack | localhost |          |
+------+-----------+----------+

suse11b:~ # mysql -ujack -p -h localhost
Enter password: 

[email protected][(none)]> show grants for current_user; --该方式等同于show grants,查看自身权限
+---------------------------------------------------+
| Grants for [email protected]                         |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘jack‘@‘localhost‘ |
+---------------------------------------------------+

--在当前session下查看其他用户的权限。注,当前session登陆的用户也须要有权限才干查看其他用户权限
[email protected][(none)]> show grants for ‘frank‘@‘%‘;
+------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘frank‘@‘%‘ IDENTIFIED BY PASSWORD ‘*63DAA25989C7E01EB96570FA4DBE154711BEB361‘ |
| GRANT SELECT ON `tempdb`.* TO ‘frank‘@‘%‘                                                            |
+------------------------------------------------------------------------------------------------------+

--以下演示基于对象列级别的授权
--首先revoke之前的select权限
[email protected][(none)]> revoke select on tempdb.* from ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

[email protected][tempdb]> create table tb_user as select * from mysql.user;
Query OK, 9 rows affected (0.15 sec)
Records: 9  Duplicates: 0  Warnings: 0

[email protected][tempdb]> grant select(user,host),update(host) on tempdb.tb_user to ‘frank‘@‘%‘;
ERROR 1142 (42000): GRANT command denied to user ‘fred‘@‘localhost‘ for table ‘tb_user‘ --授权失败

--以下使用root来授权
[email protected][(none)]> grant select(user,host),update(host) on tempdb.tb_user to ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

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

--以下检查一下frank所拥有的权限
[email protected][(none)]> show grants for ‘frank‘;
+------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘frank‘@‘%‘ IDENTIFIED BY PASSWORD ‘*63DAA25989C7E01EB96570FA4DBE154711BEB361‘ |
| GRANT SELECT (user, host), UPDATE (host) ON `tempdb`.`tb_user` TO ‘frank‘@‘%‘                        |
+------------------------------------------------------------------------------------------------------+

--以下使用frank身份来验证所授予的权限
[email protected][(none)]> desc tempdb.tb_user;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| Host  | char(60) | NO   |     |         |       |
| User  | char(16) | NO   |     |         |       |
+-------+----------+------+-----+---------+-------+

[email protected][(none)]> select * from tempdb.tb_user;   --訪问时不支持通配符,必须指定列名
ERROR 1142 (42000): SELECT command denied to user ‘frank‘@‘suse11a.site‘ for table ‘tb_user‘

[email protected][(none)]> select host,user from tempdb.tb_user where user=‘frank‘;
+------+-------+
| host | user  |
+------+-------+
| %    | frank |
+------+-------+

--须要注意的是,假设你的对象创建在test相关数据库下。权限限制可能会失效。
--以下这个查询用于查看db的授权表
[email protected][(none)]> select host,db,user from mysql.db;
+------+---------+------+
| host | db      | user |
+------+---------+------+
| %    | test    |      |
| %    | test\_% |      |
+------+---------+------+

--依据前面的权限授予,列host能够被更新,而列user不行。如以下的2条SQL语句运行的结果
[email protected][(none)]> update tempdb.tb_user set host=‘localhost‘ where user=‘frank‘;
Query OK, 1 row affected (0.12 sec)
Rows matched: 1  Changed: 1  Warnings: 0

[email protected][(none)]> update tempdb.tb_user set user=‘jason‘ where user=‘jack‘;
ERROR 1143 (42000): UPDATE command denied to user ‘frank‘@‘suse11a.site‘ for column ‘user‘ in table ‘tb_user‘

--关于WITH GRANT OPTION
[email protected][(none)]> show grants;   --注意root下有WITH GRANT OPTION
+---------------------------------------------------------------------+
| Grants for [email protected]                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘localhost‘ WITH GRANT OPTION |
| GRANT PROXY ON ‘‘@‘‘ TO ‘root‘@‘localhost‘ WITH GRANT OPTION        |
+---------------------------------------------------------------------+

[email protected][(none)]> show grants for ‘jack‘@‘localhost‘; --注意jack下没有WITH GRANT OPTION
+---------------------------------------------------+       --这就是前面为什么用户自身创建的对象而无法授权的问题
| Grants for [email protected]                         |
+---------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘jack‘@‘localhost‘ |
+---------------------------------------------------+         

4、撤销权限

撤销权限使用的是revokekeyword,撤销与授权的权限方式基本相似。
其次有哪些权限能够授予。对应地就有哪些权限能够撤销。原来的to子句呢则变成了from子句。
如以下的演示样例
mysql> revoke SELECT (user, host), UPDATE (host) ON `tempdb`.`tb_user` from ‘frank‘@‘%‘;
mysql> revoke all privileges, grant option from ‘frank‘@‘%‘;

[email protected][(none)]> revoke SELECT (user, host), UPDATE (host) ON `tempdb`.`tb_user` from ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

-- Author : Leshami
-- Blog   : http://blog.csdn.net/leshami

[email protected][(none)]> revoke all privileges, grant option from ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.01 sec)

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

[email protected][(none)]> show grants for ‘frank‘;  --查看revoke之后仅拥有最基本权限
+------------------------------------------------------------------------------------------------------+
| Grants for [email protected]%                                                                                   |
+------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘frank‘@‘%‘ IDENTIFIED BY PASSWORD ‘*63DAA25989C7E01EB96570FA4DBE154711BEB361‘ |
+------------------------------------------------------------------------------------------------------+

5、删除及重命名账户

使用drop user命令删除用户
--查看当前系统中已存在的用户
[email protected][(none)]> select user,host,Password from mysql.user;
+-------+-----------+-------------------------------------------+
| user  | host      | Password                                  |
+-------+-----------+-------------------------------------------+
| root  | localhost |                                           |
| root  | suse11b   |                                           |
| root  | 127.0.0.1 |                                           |
| root  | ::1       |                                           |
|       | localhost |                                           |
|       | suse11b   |                                           |
| fred  | localhost |                                           |
| frank | %         | *63DAA25989C7E01EB96570FA4DBE154711BEB361 |
| jack  | localhost |                                           |
+-------+-----------+-------------------------------------------+

--使用drop user命令删除用户
[email protected][(none)]> drop user ‘frank‘@‘%‘;
Query OK, 0 rows affected (0.00 sec)

[email protected][(none)]> drop user ‘fred‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

[email protected][(none)]> select user,host,Password from mysql.user where user like ‘fr%‘;
Empty set (0.00 sec)

--怎样重命名帐户,使用rename user命令
[email protected][(none)]> rename user ‘jack‘@‘localhost‘ to ‘jason‘@‘localhost‘;
Query OK, 0 rows affected (0.00 sec)

[email protected][(none)]> select user,host,Password from mysql.user where user like ‘j%‘;
+-------+-----------+----------+
| user  | host      | Password |
+-------+-----------+----------+
| jason | localhost |          |
+-------+-----------+----------+

--对于用户的删除也能够直接从mysql.user进行删除对应的记录。但不推荐直接操作mysql系统表

时间: 2024-07-30 10:18:34

MySQL 用户与权限管理的相关文章

第15章 mysql 用户、权限管理

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] Chapter 6 Security [6] 5.7. MySQL访问权限系统

mysql 用户和权限管理

1.用户连接到 mysql,并作各种查询,对用户权你是谁限的检查1.对于 mysql 你有没有权限连接上来,必须满足下面三个参数:1.你从哪里来?:host 2.你是谁? :user 1.新增一个用户: 命令格式:grant [权限1,权限2,权限3] on *.* to [email protected] identified by password 2.查看一个用户的权限:select * from user where user=root \G; 3.回收权限:revoke [权限] on

第01章 mySQL用户和权限管理v1

韩立刚老师视频教学网站 http://www.91xueit.com 韩老师QQ458717185 第01章 MySQL用户和权限管理 mySQL权限控制通过两步控制,能不能连接(验证用户身份),能执行什么操作(验证用户权限). 验证用户身份,需要验证,连接mySQL的计算机的IP地址或计算机名称,用户账户和密码.验证过程如下: 管理mySQL用户 查看mySQL用户账户 mySQL用户存储在mysql数据库的user表,该表在mySQL服务启动时自动加载到内存,控制用户的登录. [[email

Mysql 用户,权限管理的几点理解。

前两天项目数据库要移植到mysql,为此临时抓了几天很久没用的mysql. 公司的数据库比较简单,从oracle迁移到mysql很简单,但是,中间的权限管理让我感觉既简单又复杂..简单是因为网上关于mysql用户,权限管理的帖子很多, 按照上面的做,基本上能解决遇到的问题.复杂是因为如果考虑的特殊的场景,权限管理会让很多新手蛋疼的不要不要的. mysql权限的基础我在这里就不讲了,大家一艘一大把,我这里主要就我的理解在前人基础上做一些解读.公司用的是mysql5.5,所以我的解读仅限于这个版本.

Linux运维 第四阶段 (五) MySQL用户和权限管理

Linux运维 第四阶段 (四)MySQL用户和权限管理 1.相关概念: >mysql用户: 类似VSFTPD虚拟用户: 密码,自己独有的加密机制,PASSWORD函数: 用户名@主机: 用户名16字符以内,主机(主机名.IP.网络地址.通配符(%,_): --skip-name-resolve(跳过名称解析,可提高用户连接速度) 账号是用来认证的: >RENAME USER  'old_name'@'host'  TO  'new_name'@'host;  (重命名用户) >权限,授

数据库 之 MySQL用户和权限管理

1  概述 MySQL用户和权限管理 遵循最小权限授权法则,保证系统的安全性 本文主要讲解关于用户MySQL用户和权限管理的相关概念和操作 3  MySQL权限类别 库级别:对某些库拥有对应的权限 表级别:对某些表拥有相关权限 字段级别: 管理类:如super 程序类:如调用一个函数,或者执行一个函数 管理类: CREATE USER:创建用户账号 RELOAD:重新载入 LOCK TABLES:锁定表 REPLICATION CLIENT, REPLICATION SLAVE:复制功能 SHU

【转】mysql 用户及权限管理 小结

转自:https://www.cnblogs.com/SQL888/p/5748824.html mysql 用户及权限管理 小结 MySQL 默认有个root用户,但是这个用户权限太大,一般只在管理数据库时候才用.如果在项目中要连接 MySQL 数据库,则建议新建一个权限较小的用户来连接. 在 MySQL 命令行模式下输入如下命令可以为 MySQL 创建一个新用户: 1 CREATE USER username IDENTIFIED BY 'password'; 新用户创建完成,但是此刻如果以

MySQL用户和权限管理

MySQL用户权限表 MySQL的认证是“用户”加“主机”而权限是访问资源对象,MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化.存储账户权限信息表主要有:user,db,tables_priv,columns_priv,procs_priv这五张表(5.6之前还有host表,现在已经把host内容整合进user表),五张表其含义分别是: user表 user表时MySQL中最重要的一个权限表,记录允许连接到服务器的

(转)Mysql用户与权限管理

========对于ROOT用户的密码操作(更改用户密码)======== 刚刚安装完的Mysql,只一有个root用户,密码为空,而且只能在本机登录! 为root加上密码xxx123:./bin/mysqladmin -u root password xxx123或写成./bin/mysqladmin -uroot password xxx123 加下密码之后,在本进行进入mysql:./bin/mysql -uroot -p 更改root的密码由xxx123改为yy1234:./bin/my