1. 概述
数据库可以单独创建用户,而不使用登陆主机系统的账号,同时,可以对所创建的用户进行权限管理,实现了系统安全
权限管理中,属于DCL:Data Control Language 数据控制语言,关键字:GRANT:授权 和 REVOKE:取消权限
2 用户管理
用户账号
.用户账号:'user'@'host'
user:用户名
host:允许用户通过哪些主机远程连接mysqld服务
IP、网络地址、主机名、通配符(%和_)
mysql可以限定从哪个主机发起连接
主机名如果写出主机名,而不是ip,那么网络中就要有dns能将主机名解析为ip,否则连接会失败
如授权是192.168.1.%的ip段,连接时host是www.magedu.com,如果被解析为192.168.1.100,那么就可以连接该数据库,事实上192.168.1.100这个ip的主机名不用是固定,只需要能被解析为192.168.1.100就可以
2.1 创建用户
CREATE USER'username'@'host' [IDENTIFIED BY 'password'];
用户名是有用户名+主机名(或者ip)组合成一个用户名
这样的效果是组合验证,有限制的作用,某个用户只能在指定的用户名或者是指定的ip才能访问数据库
create usersunny@'172.18.50.%' identified by 'Pass123456';
在其他机器上连接,命令如下
mysql -usunny -pPass1234-h172.18.50.73;
创建完账号后,要给账号赋予权限,才能访问对应的表
在服务器上,授权用户sunny对数据库服务器里的sunny这个库具有所有的权限
grant all on sunny.* tosunny@'172.18.50.%';
授权sunny具有管理所有库的权限
grant all on *.* tosunny@'172.18.50.%';
多了identify这个关键字,在授权的时候同时创建账号
grant select,update on sunny.* tojack@'192.168.32.%' identified by "Pass123456";
.查看当前用户:
SELECT user();
.查看用户:这个命令需要在mysql库里查看,因为user这张表是建在mysql库里,use mysql;
SELECT User,Host,PasswordFROM user;
2.2 删除用户
DROP USER 'username'@'host';
示例:删除默认的空用户
DROP USER ''@'localhost';
例子
drop user jack@"192.168.32.%";
2.3 更改口令
1)SET PASSWORD FOR'user'@'host' = PASSWORD(‘password');
PASSWORD(‘password')改口令,=
PASSWORD(‘password')这个函数主要是用来给密码进行加密;建议用这个方法执行更改密码的操作。
例子,注意密码也要用引号引起来,马上生效,客户端只要推出重新登陆就要用新密码登陆
set password for"sunny"@"192.168.32.%" = password("Pass123456");
2) UPDATE user SETpassword=PASSWORD('magedu') WHERE User='root' ;
注意:上面修改表的命令不会马上生效,客户端退出重新登陆也还是要用旧密码,需要在服务器端执行:FLUSH PRIVILEGES生效
这个命令不一定都要执行,有些时候会马上生效,如果授权后,而且刷新权限后还不生效,就退出重新登录就会生效
3)/usr/local/mysql/bin/mysqladmin-u root–poldpasswordpassword 'newpassword‘
另外,linux下破解密码最暴力的是清掉mysql这个目录,但是也会把mysql目录下的表都删掉,不建议这么破解账号
windows下忘记root密码的时候,破解密码
1.关闭正在运行的MySQL服务。
2.打开DOS窗口,转到mysql\bin目录。
3.输入mysqld
--skip-grant-tables回车。--skip-grant-tables的意思是启动MySQL服务的时候跳过权限表认证。
4.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5.输入mysql回车,如果成功,将出现MySQL提示符>。
6.连接权限数据库:use mysql;。
6.改密码:update
user set password=password("123") where user="root";(别忘了最后加分号)。
7.刷新权限(必须步骤):flush privileges;。
8.退出quit。
9.注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
源文档<http://www.jb51.net/article/39454.htm>
3 权限管理
3.1 授权
.权限级别:管理权限、数据库、表、字段、存储例程
.Help GRANT
.GRANT priv_type,... ON [object_type]db_name.tb_nameTO 'user'@'host'[IDENTIFIED BY 'password'] [WITH GRANT OPTION];
[IDENTIFIED BY 'password']的命令不仅授权,而且如果账号不存在,会直接新生成不存在的账号
WITH GRANT OPTION该账号可以把自己的权限授权给别的账号,一般不这么操作
priv_type: ALL[PRIVILEGES]
db_name.tb_name:
*.*:所有库的所表
db_name.*:指定库的所有表
db_name.tb_name:指定库的指定表
db_name.routine_name:指定库的存储过程和函数
.示例:
GRANT SELECT,DELETE ontestdb.* TO 'testuser'@'%'IDENTIFIED BY 'testpass‘;
授权后如果新密码不生效,用命令:flush privileges;进行生效
以下命令授权sunny这个用户在任何机器上都可以登陆,而且对sunny这个数据的所有表具有select和update的权限
grant select,update onsunny.* to sunny@'%' identified by "Pass123456";
以下命令把数据库sunny的所有表格都授予root@192.168.25.%这个账号
grant all on sunny.* to root@“192.168.25.%”;
.查看指定用户获得的授权:
Help SHOW GRANTS
SHOW GRANTS FOR
'user'@'host';查看指定用户的授权
SHOW GRANTS FORCURRENT_USER[()];
查看当前用户的所有授权
show grants forcurrent_user();
3.2 回收授权
注意,需要先查看以下到底授权了哪些,这对授权进行回收,没有授权,回收不了,如原来授权了sunny.*,现在要回收sunny.f2只回收一张表的权限,就不允许的
REVOKE priv_type, ... ONdb_name.tb_nameFROM 'user'@'host
例子
revoke update on sunny.* fromjack@"%";
REVOKE DELETE ON testdb.*FROM 'testuser'@'%‘
.注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存
(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效
(2)对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表:mysql> FLUSH PRIVILEGES;
网友评论