October 1 2016

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权限

user表主要分为:用户列、权限列、安全列、资源控制列
host表主要分为:用户列、权限列

登录和退出MYSQL

mysql命令的常用参数
-h:主机名或ip,默认是localhost,最好指定-h参数
-u:用户名
-p:密码,注意:该参数后面的字符串和-p不能有空格
-P:端口号,默认为3306
数据库名:可以在命令最后指定数据库名
-e:执行SQL语句,如果指定该参数,将在登录后执行-e后面的命令或sql语句并退出

CREATE USER user [IDENTIFIED BY [PASSWORD] ‘password’]
[, user [IDENTIFIED BY [PASSWORD] ‘password’]]
CREATE USER ‘ucjmh’@’%’ identified BY ‘ucjmh’;

如果指定用户登录不需要密码,则可以省略identified BY部分

对于使用插件认证连接的用户,服务器调用指定名称的插件,客户端需要提供验证方法所需要的凭据。

如果创建用户时或者连接服务器时,服务器找不到对应的插件,将返回一个错误

identified with语法

CREATE USER ‘ucjmh’@’%’ identified with my_auth_plugin;
identified with只能在MYSQL5.5.7及以上版本使用。
identified with和identified by是互斥的,
所以对一个帐户来说只能使用一个验证方法。
CREATE USER语句的操作会被记录到服务器日志文件或者操作历史文件中 ~/.mysql_history。这意味着对这些文件有读取权限的人,都可以读取到新添加用户的明文密码

一个办法就是新建用户的时候使用password关键字
CREATE user ‘tom’@’localhost’ identified BY password’*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4′;
SELECT password(‘mypass’);
SELECT * FROM `mysql`.`user` WHERE `User` =’tom’;

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’;
注意:User表中的user和host字段区分大小写,在查询的时候要指定正确的用户名或主机名

直接操作MYSQL用户表
不管是CREATE USER还是GRANT USER,在创建用户时,实际上都是在user表中添加一条新记录。
使用INSERT语句向mysql.user表INSERT一条记录来创建一个新用户
插入的时候必须要有INSERT权限
INSERT INTO mysql.user(host,user,password,[privilegelist])
VALUES (‘host’,’username’,password(‘password’),privilegevaluelist)

使用DROP USER语句删除用户,也可以直接通过DELETE从mysql.user表中删除对应的记录来删除用户
DROP USER语句用于删除一个或多个MYSQL帐户。要使用DROP USER,必须拥有MYSQL数据库的全局
CREATE USER 权限或DELETE权限。

DROP user ‘testUser’@’localhost’;
或者
DELETE FROM mysql.user WHERE `Host`=’localhost’ and `User`=’testUser’
root用户修改自己的密码
1.mysqladmin -u root -p password”rootpwd”
2.UPDATE mysql.user SET `Password` =password(‘rootpwd’) WHERE `User`=’root’ and `Host`=’localhost’
password(”)函数用来加密用户密码。执行update之后需要执行flush privileges语句重新加载用户权限
3.SET PASSWORD=PASSWORD(“ROOTPWD”)
root用户修改普通用户密码
1.SET PASSWORD FOR ‘USER’@’HOST’ =PASSWORD(“ROOTPWD”)
2.UPDATE mysql.user SET `Password` =password(‘rootpwd’) WHERE `User`=’root’ and `Host`=’localhost’
执行完毕之后需要使用flush privileges语句或者重启MYSQL重新加载用户权限
3.GRANT USAGE ON *.* TO ‘someuser’@’%’ IDENTIFIED BY ‘somepwd’

使用GRANT语句和MYSQLADMIN设置密码,他们均会加密密码,这种情况下,不需要使用PASSWORD()函数
普通用户修改密码
1.SET password=password(‘newpassword’);

root用户密码丢失的解决办法

使用–skip-grant-tables选项启动MYSQL服务
使用–skip-grant-tables选项启动MYSQL时,服务器将不加载权限判断,任何用户都能访问数据库

mysqld_safe –skip-grant-tables user=mysql
权限:

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 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表中保存。

SHOW GRANTS语句可以显示用户的权限信息
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权限

mysql> show grants for ‘root’@’%’;
+——————————————————————————————————————————–+
| Grants for root@% |
+——————————————————————————————————————————–+
| GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY PASSWORD ‘*9744FA76047D4EA465C0538875FAAD8931FEBAA6’ WITH GRANT OPTION |
+——————————————————————————————————————————–+
1 row in set (0.00 sec)



Copyright 2019. All rights reserved.

Posted 2016年10月1日 by ucjmh in category "mysql

Leave a Reply

Your email address will not be published. Required fields are marked *