在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 | ? |
| 权限字段 | Select_priv | Select_priv | Select_priv |
| ? | Insert_priv | Insert_priv | Insert_priv |
| ? | Update_priv | Update_priv | Update_priv |
| ? | Delete_priv | Delete_priv | Delete_priv |
| ? | Index_priv | Index_priv | Index_priv |
| ? | Alter_priv | Alter_priv | Alter_priv |
| ? | Create_priv | Create_priv | Create_priv |
| ? | Drop_priv | Drop_priv | Drop_priv |
| ? | Grant_priv | Grant_priv | Grant_priv |
| ? | Reload_priv | ? | ? |
| ? | Shutdown_priv | ? | ? |
| ? | Process_priv | ? | ? |
| ? | File_priv | ? | ? |
对存取控制的第二阶段(请求证实),如果请求涉及表,服务器可以另外参考tables_priv和columns_priv表。这些表的字段如下:
| 表名称 | tables_priv | columns_priv |
| 范围字段 | Host | Host |
| ? | Db | Db |
| ? | User | User |
| ? | Table_name | Table_name |
| ? | ? | Column_name |
| 权限字段 | Table_priv | Column_priv |
| ? | Column_priv | ? |
| 其他字段 | Timestamp | Timestamp |
| ? | Grantor | ? |
每个授权表包含范围字段和权限字段。
user表主要分为:用户列、权限列、安全列、资源控制列
host表主要分为:用户列、权限列
这里美中不足的是mysql.user 没有一个列是保存用户创建时间的
有时候排查用户问题的时候,比如某个客户在某个时间说连接不上数据库,我们在user表里只能查到是否存在那个用户
但是不知道这个用户的创建时间,也就是说客户说的那个时间究竟用户是否已经创建我们是不知道的
帐户管理
MYSQL提供许多语句用来管理用户帐号,这些语句可以用来包括登录和退出MYSQL服务器、创建用户、删除用户、密码管理、权限管理
MYSQL数据库的安全性,需要通过帐户管理来保证
登录和退出MYSQL
mysql命令的常用参数
-h:主机名或ip,默认是localhost,最好指定-h参数
-u:用户名
-p:密码,注意:该参数后面的字符串和-p不能有空格
-P:端口号,默认为3306
数据库名:可以在命令最后指定数据库名
-e:执行SQL语句,如果指定该参数,将在登录后执行-e后面的命令或sql语句并退出

?
命令执行完之后返回book表的结构,查询返回之后会自动退出MYSQL
用户
?
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']]
?
新建普通用户
?
CREATE USER 'jeffrey'@'localhost' identified BY 'mypass';
?
用户名部分为“jeffrey”,主机名默认为“%”(即对所有主机开放权限)
如果指定用户登录不需要密码,则可以省略identified BY部分
对于使用插件认证连接的用户,服务器调用指定名称的插件,客户端需要提供验证方法所需要的凭据。
如果创建用户时或者连接服务器时,服务器找不到对应的插件,将返回一个错误
identified with语法
?
CREATE user 'jeffrey'@'localhost' 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语句创建新用户
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