数据库原理及应用_数据库管理和保护_第5章数据库的安全性_MySQL的安全设置:用户管理、权限管理和角色管理
前言
"<数据库原理及应用>(MySQL版)".以下称为"本书"中第5.7节内容
引入
本书P143:MySQL安全设置用于实现"正确的人"能够"正确地访问""正确的数据库资源".MySQL通过两个模块实现数据库资源的安全访问控制,即身份认证模块和权限验证模块.5.7节内容包括用户管理,权限管理和角色管理三部分.
5.7.1用户管理
MySQL用户包括root用户和普通用户,root用户是超级管理员,拥有所有的权限,而普通用户只能被授权.
1.创建用户
语法:
CREATE USER 用户名 IDENTIFIED BY 密码;
说明:简化的语法,只设置一个用户名及密码,详情参见本书P144.
举例(例5-1):
CREATE USER tempuser@localhost IDENTIFIED BY 'temp';
注意:以上语句是笔者在navicat premium lite17中,在数据库myds(自建数据库)中写入的查询语句,在mysql(系统自带数据库)中输入查询语句
SELECT * FROM USER;
得到结果
最后一项是刚才添加的用户:tmpuser.说明root管理员不管当前在哪个数据库里操作,都实现了其最高的权限.
2.修改用户密码
语法:
SET PASSWORD FOR 用户 = '新密码';
举例(例5-2):
SET PASSWORD FOR tmpuser@localhost = 'root';
3.修改用户名
语法:
RENAME USER 旧用户名 TO 新用户名;
举例(例5-4):
RENAME USER tmpuser@localhost TO tmp_U;
再次跳转到mysql数据库(系统自带数据库),建立新查询
SELECT * FROM USER;
得到结果:这里因为没有用tmp_U@localhost,所以前面的Host里也没有localhost,并没有报错.
4.删除用户
语法:
DROP USER 用户名;
举例(例5-5):
DROP USER tmp_U;
以下是结果:用户tmp_U已被删除
以上是用户操作,语法很直观
5.7.2权限管理
总览
权限管理分为授予权限和撤销权限.撤销权限的操作和授予权限有对应关系.
授予权限有两点注意
1>本书提到权限分为5类,其实有4类,从语法上看出字段级别权限和表级别权限没有区别.仔细看字段级别权限比较小,只能查询SELECT,插入INSERT,更新UPDATE表内容.限于表内容的部分权限(俗称的'增删改查'中的'增改查',不能删除表内容),而没有表结构的(新建删除和列修改)的权限
2>授权的语法概括
GRANT 权限名称1,权限名称2...
ON XXX
TO 用户1,用户2...
其中斜体部分为具体内容(根据实际情况填入),红色的xxx表示不同的权限级别.
授权管理
1.表级别(字段级别)权限
语法:
GRANT 权限名称1,权限名称2...
ON TABLE 数据库名.表名或视图名
TO 用户1,用户2...
在ON和TO之间指明了授予权限给哪个表(视图相当于依托现有表生成的一张表,前面提过)
例5-7授予表级别权限示例
在当前数据库输入(以root超管身份)以下查询语句
(笔者自建的数据库名叫myds,本书叫scott1,有出入)
CREATE USER table_user@localhost IDENTIFIED BY 'password';GRANT ALTER,SELECT,INSERT(empno,ename)
ON TABLE myds.emp
TO table_user@localhost;
在mysql系统数据库输入查询语句
SELECT * FROM tables_priv
WHERE host='localhost' AND user='table_user';
结果:
以table_user用户连接服务器,建立的连接名称叫"table_user测试",在navicat premium lite17中显示如下图,执行以下语句
DESC myds.emp;
结果:
再执行以下语句:
ALTER TABLE myds.emp
MODIFY COLUMN empno INT;DESC myds.emp;
结果(ALTER操作已成功)
如果此处想修改(update)emp表中数据(SMITH改为SMI),操作如下,将被拒绝(提示没有update权限)
注意:
本书P147:系统数据MySQL的系统表Table_priv中记录了用户表级别权限的验证信息.实操应为:tables_priv.
2.存储程序(过程)级别权限
语法:
GRANT 权限名称1,权限名称2...
ON FUNCTION|PROCEDURE 数据库名.函数名|数据库名.过程名
TO 用户1,用户2...
语法上和表级别权限类似,ON后面先写类型(程序或过程),再写哪个数据库的哪个函数或过程
因笔者前面未写和数据库函数和过程的帖子,所以暂时先放一下
系统数据库MySQL的系统表Proc_priv中记录了用户关于存储程序或过程级别权限的信息.
3.数据库级别权限
语法:
GRANT 权限名称1,权限名称2...
ON 数据库名.*
TO 用户1,用户2...
语法上和前面有所区别,ON后面添加数据库名和'.*',数据库名需要具体名称输入,'.*'是固定的输入
例5-9数据库级别权限示例,
在myds数据库下输入(本书在mysql系统数据库下输入,因为是root权限,所以都可行)
CREATE USER database_user@localhost IDENTIFIED BY 'password';GRANT CREATE,SELECT,DROP
ON myds.*
TO database_user@localhost;
在mysql系统数据库下输入查询语句--这里需要用mysql系统数据库
SELECT * FROM db
WHERE host='localhost' AND db='myds';
结果(权限已赋予):
以database_user@localhost(或database_user)用户连接MySQL服务器, 输入以下语句
create table myds.employee4
(empno int not null primary key,ename varchar(14)
)
---因为笔者在myds里有employee表,所以添加的表名为employee4.
输入显示指令desc myds.employee4; ,结果如下---添加成功
点开自建数据库myds,里面也能看见新建的表employee4
=============================内容分割线↓===================================
对于表级别权限和数据库级别权限的具体内容,可参照本书P147,P149,P150
有个选项叫做'WITH GRANT OPTION',有些令人迷惑,是root给的权限吗,但由root生成的用户user似乎没有create user的权限,但是无需纠结这个选项不用就是了,后面的角色管理可以解决这个问题.
=============================内容分割线↑===================================
4.管理员级别权限
语法:
GRANT 权限名称1,权限名称2...
ON *.*
TO 用户1,用户2...
语法固定格式:在ON和TO之间用'*.*'
写法参照例5-10,即将所有前面权限赋给管理员级别权限的用户
当授予管理员级别权限时,本书表5-5权限自动被添加.表5-4权限根据实际情况添加.
注意:本书P151:系统数据库MySQL的系统表user记录了服务器管理员级别权限的认证信息.这句话有歧义,user表记录的是所有用户的级别权限信息,里面包含了服务器管理员---查看user表,管理员所有权限几乎都是Y,对应了本书例子中的语句'GRANT ALL PRIVILEGES'
CREATE USER server_user@localhost IDENTIFIED BY 'password';GRANT ALL PRIVILEGES
ON *.*
TO server_user@localhost;
在mysql系统数据库中输入查询语句
SELECT * FROM user
WHERE host='localhost' AND user='server_user';
结果:
有的项目不是Y而是N,可以看看
撤销权限
有两种方法:全部撤销和撤销指定权限.
撤销指定权限的格式和授权格式基本一致,把GRANT改为REVOKE
具体写法见本书P152和P153,比较直观.
5.7.3角色管理
当用户较多时,如果一个个去授权,显得比较麻烦.所以产生了角色的概念.
'角色'和'用户'是一种'组'和'个体'的关系.每个数据库用户都有一个'角色'.管理员给角色授权,角色内所有用户拥有同样的授权.再给具体用户分配角色
操作过程:创建角色,给角色授权,授予用户角色.
此外还可以撤销用户角色以及删除角色.
小结
授权内容和数据库操作的内容是对应的.