mysql 使用者及許可權管理 小結

li__hl8888發表於2019-03-25

轉載自https://www.cnblogs.com/SQL888/p/5748824.html

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許可權表存放在my 裡,由 _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。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8568259/viewspace-2639254/,如需轉載,請註明出處,否則將追究法律責任。

相關文章