权限管理:
用户:
系统层面:用户就是一个用户名===>用户名:密码
能做什么?
1、登录系统
2、管理系统对象
MySQL:
不再是单纯的用户名和密码
用户名@'主机范围' 主机范围被称之为白名单
主机范围:
本地连接::
localhost
**
远程连接:**
10.0.0.200
oldboy.com
10.0.0.% 网段
10.0.0.5%
% XXXX 不建议用
开发申请用户时,提供给管理:
app@'10.0.0.%' 密码: xxxx
权限: ALL privileges
SELECT, INSERT, UPDATE, DELETE, CREATE, RELOAD,
SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER,
SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, DROP
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT,
CREATE VIEW, SHOW VIEW, CREATE ROUTINE,
ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
开发人员可能会用到的权限:
create update insert select CREATE VIEW CREATE ROUTINE SHOW VIEW
CREATE TEMPORARY TABLES ALTER
grant 权限 on 权限作用范围 to 用户 identified by '密码'
.
py.py.t1
grant create,update,insert,select ,CREATE VIEW on py. to py@'192.168.12.%' identified by '123';
select user,host,password from mysql.user;
开发人员申请用户流程:
1、IP段
2、用户名、密码要求
3、需要哪些权限
MySQL中创建一个数据库时通常是要设置字符集的,一般情况下我们会设定为UTF-8,但是通常还会出现一个数据库校对规则,
有好多可选择的。可选择utf8_general_ci
这里给出示范操作:
在创建mysql数据库的时候如何支持UTF-8编码
1、用工具
CHARSET字符集:选择 utf8
COLLATION数据库校验规则:选择 utf8_general_ci
2、用SQL语句
GBK: CREATE DATABASE test1 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
UTF-8: CREATE DATABASE test2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
创建了一个utf8的mydb的数据库:
CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_general_ci;
指定部分权限给用户:
增加一个test1用户,密码为123456,可以在任何主机上登录,并对所有数据库有查询,增加,修改和删除的功能:
grant select,insert,update,delete on mydb.* to test1@'%' identified by '123456';
FLUSH PRIVILEGES;#刷新系统权限表
授权test1所有权限:
GRANT ALL ON mydb.* TO username@localhost IDENTIFIED BY password';
查看创建用户的密码:【mysql所有的用户都存储在mysql.user这个表中】
mysql> select user,host,password from mysql.user;
ERROR 1054 (42S22): Unknown column 'password' in 'field list'
查看数据库的表有哪些字段可以查询:authentication_string
help show;
创建
SHOW CREATE TABLE tbl_name;
select * from mysql.user ;
报错原因解决:
mysql5.7以后mysql.user表中没有了password字段,而是使用authentication_string来代替。
select user,host,authentication_string from mysql.user;
等同于
use mysql;
select user,host,authentication_string from user;
update mysql.user setauthentication_string=password(“新密码”) where User=”test” and Host=”localhost”;
flush privileges;
设置mysql的root密码:
输入update mysql.user set authentication_string=password('密码')where user='账户';假设密码是123。
最后输入flush privileges;按回车,告诉mysql刷新一下系统权限,此时修改的密码才会生效。
update mysql.user set authentication_string=password(123456) where User="root" and Host="localhost";
mysql 跳过密码验证:
最好以管理员身份运行cmd,进入bin目录下,然后停止服务器,输入net stop mysql,
再输入 mysqld --skip-grant-tables (回车,启动mysql,意思是告诉mysql不需要登录验证)。
然后关掉cmd,再重新打开。
输入mysql -uroot -p 连续按两次回车按钮会直接进入mysql的控制台界面,此时发现登录 root 账号是不需要密码的。
删除mysql.user表中的用户:
Delete FROM mysql.user Where User="用户名" and Host=”localhost”;
flush privileges;
小节:
一、创建数据库:
1、 CREATE DATABASE 数据库名;
2、 GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON 数据库名.* TO 数据库名@localhost IDENTIFIED BY '密码';
3、 SET PASSWORD FOR
'数据库名'@'localhost' = OLD_PASSWORD('密码');
依次执行3个命令完成数据库创建。注意:中文 “密码”和“数据库”是户自己需要设置的。
二、修改密码:
mysql -u root -p
update mysql.user setauthentication_string=password(“新密码”) where User=”test” and Host=”localhost”;
flush privileges;
mysql5.7以后mysql.user表中没有了password字段,而是使用authentication_string来代替。
三、删除用户:
mysql -u root -p
Delete FROM mysql.user Where User="用户名" and Host=”localhost”;
flush privileges;
创建用户
命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';
删除账户及权限:
drop user 用户名@’%’;
drop user 用户名@ localhost;
注意:
创建一个只允许从本地登录的超级用户yan,并允许将权限赋予别的用户,密码为111
GRANT ALL PRIVILEGES ON . TO yan@'localhost' IDENTIFIED BY '111' WITH GRANT OPTION;
GRANT命令说明:
ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限提到的权限。
ON 用来指定权限针对哪些库和表。
. 中前面的号用来指定数据库名,后面的号用来指定表名
TO 表示将权限赋予某个用户。
test@'%' 表示feihong用户,@后面接限制的主机,可以是IP、IP段、域名以及%,localhost表示本地
%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。
注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项
导致后来该用户不能使用GRANT命令创建用户或者给其他用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加了一个select权限,
然后又给用户添加了一个insert权限,那么该用户就同时拥有了select和insert权限。
四、为用户授权:
设置权限时必须给出一下信息
1,要授予的权限
2,被授予访问权限的数据库或表
3,用户名
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 权限 on 数据库.to 用户名@登录主机 identified by “密码”;
eg: grant all privileges on.* to 'root'@'192.168.218.128' identified by 'hello' with grant option;
flush privileges; //要刷新权限
授权test用户拥有testDB数据库的所有权限:
grant all privileges on testDB.* to “test”@”localhost” identified by “1234”;
flush privileges; #刷新系统权限表
指定部分权限给用户:
grant select,update on testDB.* to “test”@”localhost” identified by “1234”;
flush privileges; #刷新系统权限表
for example:
创建一个网站用户(程序用户)
创建一个一般的程序用户,这个用户可能只需要SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES等权限如果有存储过程还需要加上EXECUTE权限,一般是指定内网网段192.168.100网段。
GRANT USAGE,SELECT, INSERT, UPDATE, DELETE, SHOW VIEW ,CREATE TEMPORARY TABLES,EXECUTE ON test.* TO webuser@'192.168.100.%' IDENTIFIED BY '[email protected]';
创建一个普通用户(仅有查询权限)
GRANT USAGE,SELECT ON test.* TO public@'192.168.100.%' IDENTIFIED BY '[email protected]';
五、查看用户的权限:
SHOW GRANTS FOR 'test1'@'%';
SHOW GRANTS FOR 'root'@'localhost';
SHOW GRANTS FOR 'webuser'@'192.168.100.%';
六、回收权限:
REVOKE DELETE ON mydb.* FROM 'test1'@'%';
七、删除用户:
注意删除用户不要使用DELETE直接删除,因为使用DELETE删除后用户的权限并未删除,新建同名用户后又会继承以前的权限。正确的做法是使用DROP USER命令删除用户,比如要删除'webuser'@'192.168.100.%'用户采用如下命令:
DROP USER 'webuser'@'192.168.100.%';
大家可以采用percona-toolkit工具中的pt-show-grants工具来辅助管理mysql权限
八、显示当前用户信息:
select user();
九、MySQL权限分配:
权限分布 :可能设置的权限
表权限:
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
列权限:
'Select', 'Insert', 'Update', 'References'
过程权限:
'Execute', 'Alter Routine', 'Grant'