MySql-权限管理

Posted alexdamiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql-权限管理相关的知识,希望对你有一定的参考价值。

mysql数据库中,有mysql_install_db脚本初始化权限表,存储权限的表有:

  1. user表
  2. db表
  3. host表
  4. table_priv表
  5. columns_priv表
  6. proc_priv表

MySQL存取控制包含2个阶段:
阶段1:服务器检查你是否允许连接。
这里写图片描述

阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例如,如果你从数据库中一个表精选(select)行或从数据库抛弃一个表,服务器确定你对表有select权限或对数据库有drop权限。
这里写图片描述

服务器在存取控制的两个阶段使用在mysql的数据库中的user、db和host表表示,
表名称 user db host
范围字段 Host Host Host
User Db Db
Password User

表名称userdbhost
范围字段host,use,passwordhost,db,userhost,db

权限的键以 _priv 结尾:
这里写图片描述

使用CREATE语句创建新用户

CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'],
[user[IDENTIFIED BY [PASSWORD] 'password']]...

创建用户

CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'

授予权限

grant all privileges on *.* to admin@% identified by ' admin';
flush privileges;

使用GRANT语句创建新用户
GRANT USER语句可以用来创建帐户,通过该语句可以在user表中添加一条新记录
比起CREATE USER语句创建的新用户,还需要使用GRANT语句

赋予用户权限
使用GRANT语句创建新用户时必须有GRANT权限。

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...]

使用GRANT语句创建一个新用户testUser,密码为testpwd,并授予用户对所有数据表的SELECT和UPDATE权限

GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' identified BY 'testpwd'
SELECT `Host` ,`User` ,`Select_priv` ,`Update_priv`  FROM mysql.user WHERE `User` ='testUser';

执行结果显示执行成功,使用SELECT语句查询用户testUser的权限
Select ‘Host’,’User’,’Select_priv’,’Update_priv’ from mysql user where ‘User’ = ‘testUser’;

root用户密码丢失的解决办法
使用–skip-grant-tables选项启动MYSQL服务
使用–skip-grant-tables选项启动MYSQL时,服务器将不加载权限判断,任何用户都能访问数据库

LINUX下
使用mysqld_safe来启动MYSQL服务,也可以使用/etc/init.d/mysql命令来启动mysql

mysqld_safe --skip-grant-tables user=mysql

或者

/etc/init.d/mysql start-mysqld --skip-grant-tables

启动MYSQL服务后,就可以使用root用户登录了

权限管理
MYSQL中的各种权限
对于GRANT和REVOKE语句,priv_type可以被指定为以下任何一种:

权限意义
ALL [PRIVILEGES]设置除GRANT OPTION之外的所有简单权限
ALTER允许使用ALTER TABLE
ALTER ROUTINE更改或取消已存储的子程序
CREATE允许使用CREATE TABLE
CREATE ROUTINE创建已存储的子程序
CREATE TEMPORARY TABLES允许使用CREATE TEMPORARY TABLE
CREATE USER允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW允许使用CREATE VIEW
DELETE允许使用DELETE
DROP允许使用DROP TABLE
EXECUTE允许用户运行已存储的子程序
FILE允许使用SELECT…INTO OUTFILE和LOAD DATA INFILE
INDEX允许使用CREATE INDEX和DROP INDEX
INSERT允许使用INSERT
LOCK TABLES允许对您拥有SELECT权限的表使用LOCK TABLES
PROCESS允许使用SHOW FULL PROCESSLIST
REFERENCES未被实施
RELOAD允许使用FLUSH
REPLICATION CLIENT允许用户询问从属服务器或主服务器的地址
REPLICATION SLAVE用于复制型从属服务器(从主服务器中读取二进制日志事件)
SELECT允许使用SELECT
SHOW DATABASES SHOW DATABASES显示所有数据库
SHOW VIEW允许使用SHOW CREATE VIEW
SHUTDOWN允许使用mysqladmin shutdown
SUPER允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。
UPDATE允许使用UPDATE
USAGE“无权限”的同义词
GRANT OPTION允许授予权限

当从旧版本的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE权限

授权
授权就是为某个用户授予权限
授予的权限可以分为多个层级:
全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限。
数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限。
表层级
表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
列层级
列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。

当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的MySQL升级时,要使用本子句,您必须升级您的授权表

收回权限
收回权限就是取消已经赋予用户的某些权限。收回用户不必要的权限可以在一定程度上保证系统的安全性。
使用REVOKE收回权限之后,用户帐户的记录将从db、host、tables_priv、columns_priv表中删除,但是用户帐号记录依然
在user表中保存。

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ... 
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

使用REVOKE语句,必须拥有mysql数据库的全局CREATE权限或UPDATE权限
使用REVOKE语句取消用户grantUser的INSERT权限

REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';

注意:当从旧版本的MYSQL升级时,如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE权限,必须先升级授权表

查看权限
SHOW GRANT语句可以显示用户的权限信息

show grants FOR 'user'@'host';

以上是关于MySql-权限管理的主要内容,如果未能解决你的问题,请参考以下文章

JS+JavaBean判断管理员增删改的操作权限

硬核!管理mysql数据库的工具

Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段

常见的mysql权限设置

MySQL的用户管理与权限管理

MySQL的用户管理与权限管理