MYSQL 用户管理
为什么需要用户管理如果我们只能使用 root 用户这样存在安全隐患。比如如果每个人都用root 账号登录那么谁都可以删除数据库、修改表结构这显然是不安全的。这时就需要使用MySQL的用户管理功能——为不同的使用者创建不同的账号并赋予不同的权限。MySQL中的用户信息都存储在系统数据库 mysql 的 user 表中。输入以下命令查看用户信息select host,user,authentication_string from usermysql select host,user,authentication_string from user; --------------------------------------------------------------------------------------------------------------------------------------- | host | user | authentication_string | --------------------------------------------------------------------------------------------------------------------------------------- | localhost | debian-sys-maint | $A$005$tUx1:cq!cF8a97SyCdx4Uu/mb1qc | | localhost | mysql.infoschema | $A$005$ACOMBINATIONOFINVALIDSALTANDPASSWOR | | localhost | mysql.session | $A$005$COMBINATIONOFINVALIDSALTANDPASSWORDTHATM | | localhost | mysql.sys | $A$005$MBINATIONOFINVALIDSALTANDPASSWORDT | | localhost | root | *6DFA7871F0CECE08918D9 | --------------------------------------------------------------------------------------------------------------------------------------- 5 rows in set (0.00 sec)三个字段的含义host表示这个用户可以从哪个主机登录。如果是localhost表示只能从本机登录如果是%表示可以从任意主机登录。user用户名authentication_string用户的登录密码显示的是加密后的密文相关操作创建用户的语法create user 用户名登陆主机/ip identified by 密码;登陆主机/ip不能缺少如果是本机登录一般都是 localhost/127.0.0.1。创建用户的行为本质就是向mysql数据库中的user表中插入数据。重要注意事项不要轻易添加一个可以从任意地方登录的用户即host为%的用户MySQL是允许远程登录的但前提是需要有允许远程登录的账号不要将自己云服务器上的MySQL端口号暴露在公网上。如果确实需要最好是即用即关。所有正常的MySQL服务它的端口一定不会直接暴露在公网上删除用户的语法drop user 用户名主机名修改用户密码自己修改自己的密码set passwordpassword(新的密码);root 用户修改指定用户的密码set password for 用户名主机名password(新的密码)注意password()函数是MySQL提供的加密函数用于将明文密码加密后存储。数据库的权限查看权限刚创建的用户是没有任何权限的。我们可以通过以下命令查看用户拥有的权限show grants for 用户名登录位置;授予权限给用户授权使用grant语句。语法grant 权限列表 on 库.对象名 to 用户名登陆位置 [identified by 密码]说明权限列表多个权限用逗号分开grant select on ... —— 只赋予查询权限grant select, delete, create on .... —— 赋予多个权限grant all [privileges] on ... —— 赋予该用户在该对象上的所有权限库.对象名库.* —— 表示某个数据库中的所有数据对象表、视图、存储过程等库.表名 —— 表示某个数据库中的特定表identified by可选项。如果用户存在赋予权限的同时修改密码如果用户不存在则创建用户。授权示例假设我们创建了一个名为 xay 的用户。用 root 账号登录 MySQL 后可以看到很多数据库但用xay 用户登录后可能什么数据库都看不到。使用 root 用户登录上 mysql 后可以看到的数据库mysql show databases; -------------------- | Database | -------------------- | connect | | general | | indexes | | information_schema | | myisam_test | | mysql | | performance_schema | | rootDB | | scott | | sys | | test | | user_db | -------------------- 12 rows in set (0.00 sec)使用 xay 用户登录上 mysql 后可以看到的数据库mysql show databases; -------------------- | Database | -------------------- | information_schema | | performance_schema | -------------------- 2 rows in set (0.00 sec)现在我们使用 root 账号创建一个名为 rootDB 的数据库并在其中创建一张名为 user 的表字段有 id 和 name。此时xay 用户是没有权限访问 rootDB 数据库的。我们可以给 xay 用户授权赋予它对 rootDB 数据库中的 user 表的所有权限grant all on rootDB.user to xay%;mysql select user(); ------------- | user() | ------------- | xaylocalhost | ------------- 1 row in set (0.00 sec) mysql use rootDB; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql select * from user; ---------- | id | name | ---------- | 1 | 张三 | | 2 | 李四 | ---------- 2 rows in set (0.00 sec)查看用户的所拥有的权限show grants for 用户名登陆位置;mysql show grants for xay%; ------------------------------------------------ | Grants for xay% | ------------------------------------------------ | GRANT USAGE ON *.* TO xay% | | GRANT ALL PRIVILEGES ON rootDB.user TO xay% | ------------------------------------------------ 2 rows in set (0.00 sec)注意如果发现赋权限后没有生效可以执行flush privileges;指令刷新权限。回收权限使用 revoke 语句revoke 权限列表 on 库.对象名 from 用户名登陆位置示例回收 xay 用户对 rootDB 库的 user 表的 insert 权限revoke insert on rootDB.user from ‘xay’’%’。再次查看 xay 用户对 rootDB 库的 user 表所拥有的权限mysql show grants for xay%; ------------------------------------------------ | Grants for xay% | ------------------------------------------------ | GRANT USAGE ON *.* TO xay% | | GRANT ALL PRIVILEGES ON rootDB.user TO xay% | ------------------------------------------------ 2 rows in set (0.00 sec) mysql revoke insert on rootDB.user from xay%; Query OK, 0 rows affected (0.01 sec) mysql show grants for xay%; ------------------------------------------------------------------------------------------------------------------------------------------ | Grants for xay% | ------------------------------------------------------------------------------------------------------------------------------------------ | GRANT USAGE ON *.* TO xay% | | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE VIEW, SHOW VIEW, TRIGGER ON rootDB.user TO xay% | ------------------------------------------------------------------------------------------------------------------------------------------ 2 rows in set (0.00 sec)可以发现缺少了insert权限。回收xay用户对rootDB库的user表的delete权限revoke delete on rootDB.user from ‘xay’’%’。 再次查看xay用户对rootDB库的user表所拥有的权限mysql show grants for xay%; ------------------------------------------------------------------------------------------------------------------------------------------ | Grants for xay% | ------------------------------------------------------------------------------------------------------------------------------------------ | GRANT USAGE ON *.* TO xay% | | GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE VIEW, SHOW VIEW, TRIGGER ON rootDB.user TO xay% | ------------------------------------------------------------------------------------------------------------------------------------------ 2 rows in set (0.00 sec) mysql revoke delete on rootDB.user from xay%; Query OK, 0 rows affected (0.01 sec) mysql show grants for xay%; ------------------------------------------------------------------------------------------------------------------------------ | Grants for xay% | ------------------------------------------------------------------------------------------------------------------------------ | GRANT USAGE ON *.* TO xay% | | GRANT SELECT, UPDATE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE VIEW, SHOW VIEW, TRIGGER ON rootDB.user TO xay% | ------------------------------------------------------------------------------------------------------------------------------ 2 rows in set (0.00 sec)可以发现缺少了delete权限。赋予只读权限只能查询不能修改grant select on 库.对象名 to 用户名登陆位置总结操作命令查看权限show grants for 用户名登录位置授予权限grant权限列表 on 库.对象名 to 用户名登录位置回收权限revoke权限列表 on 库.对象名 from 用户名登录位置刷新权限flush privileges权限管理遵循最小权限原则——只给用户完成工作所必需的权限不要给多余的权限。这样可以最大程度地保证数据安全。