目录
在我们我们登录MySQL的时候,如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。
用户
MySQL有自己的账号管理,对应的账号管理也是以表的形式进行管理的
用户信息
MySQL中的用户,都存储在系统数据库mysql的user表中;MySQL要对用户做管理其实就是记录下来哪些用户能够使用MySQL哪些不能,所以MySQL的信息也是在MySQL内特定的表中被保存了,这个表叫做user表;
使用数据库:mysql> use mysql;//mysql数据库
展现数据库表:这里的表很多都是系统自带的
显示user表数据:
展示用户基本信息:mysql> select host,user,authentication_string from user;
字段解释:
host: 表示这个用户可以从哪个主机登陆,如果是localhost,表示只能从本机登陆(如果一个系统或服务限制了只能从本机(localhost)登陆,那么只有本机上的用户可以访问或登陆该系统或服务。这意味着使用另一台电脑是无法登陆的,因为该限制禁止了远程或外部设备的登陆。)
user: 用户名
authentication_string: 用户密码通过password函数加密后的
*_priv: 用户拥有的权限
MySQL跟linux一样可以允许你创建多个用户,这些用户都叫做普通用户,你可以给他开账号,所谓的在MySQL内部开账号说人话就是把用户的用户名和允许从哪里登录和用户的密码和其他信息放到user表里面,此时就有了这样的用户
创建用户
那我如果想新建一个用户有一个简单粗暴的操作就是直接向user表中insert数据,但是太麻烦了要写太多字段内容,但是我们一般没必要而是用专门的sql语句;
语法:create user '用户名'@'登陆主机/ip' identified by '密码';
案例
演示一个用户创建过程
创建一个用户只允许本地登录名叫wwz并设定密码:mysql> create user 'wwz'@'localhost' identified by '123456';//注意你的密码有可能太过于简单从而MySQL报错不通过
那么这时候就要设置密码复杂度:mysql> create user 'wwz'@'localhost' identified by 'Wwz123456.';
查看用户表数据:mysql> select host,user,authentication_string from user;//发现新增用户
可能实际在设置密码的时候,因为mysql本身的认证等级比较高,一些简单的密码无法设置,会爆出如下报错:
ERROR1819(HY000): Your password does not satisfy the current policy requirements
查看密码设置相关要求:SHOW VARIABLES LIKE 'validate_password%';//查看 mysql 初始的密码策略
set global validate_password_policy=LOW; //改变验证等级,不过太简单了不好set global validate_password_length=6;//使用sql语句改变密码长度
此时便可以使用新账号新密码进行登陆;
关于新增用户这里,需要大家注意,不要轻易添加一个可以从任意地方登陆的user。
重新登录:[root@wwz ~]# mysql -uwwz -p //登陆成功
查看当前用户下的数据库:mysql> show databases;//发现有的数据库不让我看了,看不到我以前的库
删除用户
我当前设置的wwz普通用户不能远程登陆因为我设置了localhost只允许本地登录,说白了就是MySQL在哪台机器上你就只能在这台机器上登陆MySQL,不能跨网络登录。
删除用户你可以在这张表里进行CURD操作直接delete但是不建议
语法:drop user '用户名'@'主机名';
案例
删除用户:mysql> drop user wwz;这个操作不允许得说明在那台机器上;直接给个用户名不能删除,它默认是%,表示所有地方可以登陆的用户
mysql> drop user wwz@localhost;//因为user和host两列合起来才叫做完整的用户,得指定
再查用户表:发现没有wwz了
再创建一个新用户让他从任意远端登录:mysql> create user 'wwz'@'%' identified by 'Wwz123456.';//使用%表示可以从任意远端登录MySQL
查表:mysql> select user,host,authentication_string from user;//发现新建用户成功
MySQL允许远端登录但是一定在MySQL的服务端得配得上 允许远程登陆的账号;我们特别不建议把我们的端口号暴漏在公网上;
修改用户密码
语法:
自己改自己密码
set password=password('新的密码');
root用户修改指定用户的密码
set password for '用户名'@'主机名'=password('新的密码');
这个操作本质就是更新,当然也可以用update操作;
案例
用root身份修改刚刚创建的wwz密码:
mysql> set password for 'wwz'@'%'=password('WWz123456.');//修改成功
重新登陆就可以用新密码登录了
数据库的权限
当我们在MySQL把一个用户创建好了不是所有工作都做好了,而是权限也要处理;
MySQL数据库提供的权限列表:
给用户授权
刚创建的用户没有任何权限,需要给用户授权。
语法: grant 权限列表 on 库.对象名(表名) to '用户名'@'登陆位置' [identified by '密码']
说明:
1. 权限列表,多个权限用逗号分开
2. *.* : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
3. 库.* : 表示某个数据库中的所有数据对象(表,视图,存储过程等)
4. identified by可选。 如果用户存在,赋予权限的同时修改密码,如果该用户不存在,就是创建用户
显示当前终端登录用户: mysql> select user();
使用root身份创建一个数据库并建表:mysql> create database rootdb;
mysql> create table user( id int primary key, name varchar(20) not null );wwz使用新建的数据库:mysql> use rootdb;//权限拒绝报错,因为没有权限,一个他都不知道有这个数据库二是没权限
那么给wwz赋予全部权限:mysql> grant all on rootdb.user to 'wwz'@'%';
此时wwz在使用新建的数据库:发现此时能用
查看特定用户被赋予了什么权限 :mysql> show grants for 'wwz'@'%';
wwz向user表插入数据:mysql> insert into user values (1,'张飞');//因为他有insert权限
注意:如果发现赋权限后,没有生效,执行如下指令:flush privileges;
回收权限
那如果我不想让wwz有insert权限呢? 回收部分权限即可;
语法:revoke 权限列表 on 库.对象名 from '用户名'@'登陆位置';
删除wwz对于user表的插入权限:mysql> revoke insert on rootdb.user from 'wwz'@'%';
那么此时wwz再对user表插入:mysql> insert into user values (2,'张');//插入失败
那么此时再查看wwz的权限:mysql> show grants for 'wwz'@'%'\G原本是all但是去除了insert所以陈列了除insert的所有权限
删除wwz对user表的所有权限:mysql> revoke all on rootdb.user from 'wwz'@'%';
此时再查看wwz的权限:mysql> show grants for 'wwz'@'%';//发现什么权限都没有了
那么此时给wwz用户select权限对rootdb下的所有表:mysql> grant select on rootdb.* to 'wwz'@'%';//此时能查看rootdb数据库的所有表,原来只能看user表
以上操作均以演示为主,但不要将自己的账号密码暴漏,如果暴漏了更改密码或删除账号;