目录
一、实验目的与要求:
二、实验内容:
三、实验小结
一、实验目的与要求:
1、设计用户子模式
2、根据实际需要创建用户角色及用户,并授权
3、针对不同级别的用户定义不同的视图,以保证系统的安全性
二、实验内容:
- 先创建四类用户角色:
管理员角色Admin、客户角色Cusm、供货商角色Supp、商家销售工作人员角色Salor。
源码:
mysql> create role Admin;
Query OK, 0 rows affected (0.03 sec)
mysql> create role Cusm;
Query OK, 0 rows affected (0.01 sec)
mysql> create role Supp;
Query OK, 0 rows affected (0.00 sec)
mysql> create role Salor;
Query OK, 0 rows affected (0.00 sec)
- 创建客户视图、供货商视图
(1)客户视图要求显示所有客户号及对应客户下的所有订单及每个订单的价格
源码:
mysql> create view customers_view as
-> select customers.c_id as 客户号,orderitems.o_num as 订单号,sum(orderitems.quantity*orderitems.item_price) as 订单价格
-> from customers
-> join orders on customers.c_id=orders.c_id
-> join orderitems on orders.o_num=orderitems.o_num
-> group by customers.c_id,orderitems.o_num;
效果:
(2)供货商视图要求显示所有供货商号及供货商所供水果信息
源码:
mysql> create view suppliers_view as
-> select suppliers.s_id as 供应商编号,suppliers.s_name as 供应商名,fruits.f_id as 水果编号,fruits.f_name as 水果名称,fruits.f_price as 水果单价
-> from suppliers
-> join fruits on suppliers.s_id=fruits.s_id;
效果:
3.为以上四类用户角色授予合适的权限,要求:
(1)管理员拥有所有权限:
源码:
mysql> grant all on fruitshop.* to Admin;
Query OK, 0 rows affected (0.01 sec)
效果:
(2)客户只能查看与之相关的信息(基本信息,购买信息)
源码:
mysql> alter view view1 as
-> select customers.*, orders.o_num, orderitems.o_item, orderitems.quantity, orderitems.item_price
-> from customers
-> join orders on customers.c_id=orders.c_id
-> join orderitems on orders.o_num=orderitems.o_num
-> where customers.c_id =CAST(USER() AS UNSIGNED int);
Query OK, 0 rows affected (0.01 sec)
mysql> grant select on view1 to Cusm;
Query OK, 0 rows affected (0.00 sec)
效果:
(3)供货商只能查看与之相关的信息(可以查看自己供货的水果信息)。
源码:
mysql> create view view2 as
-> select suppliers.*,fruits.f_id,fruits.f_name,fruits.f_price
-> from suppliers
-> join fruits on suppliers.s_id=fruits.s_id
-> where suppliers.s_id =CAST(USER() AS UNSIGNED int);
Query OK, 0 rows affected (0.01 sec)
mysql> grant select on view2 to Supp;
Query OK, 0 rows affected (0.01 sec)
效果:
(4)商家销售工作人员可以查看数据库并录入信息,但不能修改、删除;
源码:
mysql> grant select , insert on fruitshop.* to Salor;
Query OK, 0 rows affected (0.01 sec)
效果:
4.为每类用户角色至少创建一个用户(新建用户并分配对应的角色,统一设置初始密码为’123456’)
注意:附上源码,创建用户并授权成功后在交互式运行状态下查看每个用户权限并截图
客户用户:C001,任意主机地址,授权为客户角色的所有权限;
供货商用户:S001,任意主机地址,授权为供货商角色的所有权限;
商家销售工作人员用户:B001,任意主机地址,授权为销售工作人员角色的所有权限;
管理员用户:A001,本机,拥有所有权限
源码:
(1)先创建用户:
mysql> create user 'C001'@'%' identified by '123456';
Query OK, 0 rows affected (0.02 sec)
mysql> create user 'S001'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> create user 'B001'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> create user 'A001'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
(2)给用户授权:
1给管理员用户‘A001’授权
mysql> grant Admin to 'A001'@'localhost';
Query OK, 0 rows affected (0.01 sec)
效果:
2给客户‘C001’授权
mysql> grant Cusm to 'C001'@'%';
Query OK, 0 rows affected (0.00 sec)
效果:
3给供应商’S001’授权
mysql> grant Supp to 'S001'@'%';
Query OK, 0 rows affected (0.00 sec)
效果:
4给商家销售工作人员用户’B001’授权
mysql> grant Salor to 'B001'@'%';
Query OK, 0 rows affected (0.01 sec)
效果:
5.测试:
退出已用root账号登陆的MySQL服务器,用这四类用户帐号分别登陆MySQL服务器并测试其功能(在交互式运行状态下测试,先附上测试源码,关键结果截图)。
测试要求:退出root帐号,重新登陆指定帐号,显示当前数据库中所有表,查看权限内某张表内的所有信息,对权限内某张表进行增、删、改、查操作并查看能否正确执行这些操作,如果执行错误请说明导致此错误的原因。
注意:每次登录后先设置当前角色,否则无效果:set role 角色名;
测试客户用户:
登录:C:\Users>mysql -uC001 -p123456
登录客户用户’C001’时,因为在customers表格中没有对应的c_id,因此查询的视图为空。结果如下图所示:
登录:C:\Users>mysql -u10001 -p123456
新创建客户用户‘10001’,登录用户’10001’时,对应customers表格中的c_id为10001时的客户信息,查询视图的结果如下图所示,即输出10001的基本信息和购买信息。
测试供货商用户:
登录:C:\Users>mysql -uS001 -p123456
登录供货商用户’S001’时,在Suppliers表格中没有对应的s_id,因此查询的结果为空,如下图所示:
登录:C:\Users>mysql -u101 -p123456
新创建供货商用户‘101’,登录供货商用户’101’时,对应Suppliers表格中的s_id=101时的供货商信息,查询的结果如下图所示,只能进行查询操作,不能进行插入、删除等其他的操作。
测试商家销售工作人员用户:
登录C:\Users>mysql -uB001 -p123456
登录’B001’商家销售工作人员用户,可以查看数据库并录入信息,但不能进行修改、删除操作,如下图所示:
可以查询、插入信息
不能进行修改、删除操作
测试管理员用户:
登录:C:\Users>mysql -uA001 -p123456
登录管理员用户,可以拥有对fruitshop数据库的所有权限,可以进行增、删、改、查操作
三、实验小结
1.实验中遇到的问题及解决过程
问题一:在创建第一个视图显示所有客户号及对应客户下的所有订单及每个订单的价格时没有进行求和操作
解决过程:结合实际,把同一个订单中不同的水果总价相加
问题二:
在给客户角色和供货商角色授权时,将客户视图和供货商视图授权给客户角色和供货商角色,使得客户角色和供货商角色都能完成查询操作,但是此时查询到的信息是所有客户或所有供货商的信息,但是客户角色和供货商角色只能查询与之相关的信息,所以需要修改使得客户与查询到的信息对应。
解决过程:通过当前客户或供货商的用户名与查询的信息对应,例如在给供货商角色授权时,使suppliers.s_id=CAST(USER() AS UNSIGNED INT)
- 实验中产生的错误及原因分析
错误一:
CREATE OR REPLACE VIEW customers_view AS
SELECT customers.c_id AS 客户号, orderitems.o_num AS 订单号, SUM(orderitems.quantity * orderitems.item_price) AS 订单价格
FROM customers
JOIN orders ON customers.c_id = orders.c_id
JOIN orderitems ON orders.o_num = orderitems.o_num
GROUP BY customers.c_id;
原因分析:在创建视图customers_view时使用group by语句只包含customers.c_id,没有将orderitems.o_num包含进去,这个错误使MySQL 中启用了only_full_group_by 模式。
错误二:
在测试阶段登录用户后没有设置当前角色set role,无法测试
原因分析:没有激活当前角色,需要set role
3.实验体会和收获。
通过本次实验,了解了在数据库中的视图、角色、用户以及授权等关于安全性的相关知识。在设计视图时,对于不同的用户角色可能需要不同的视图,通过这样保证系统的安全性;同时,在为角色和用户授权时,也需要根据不同的情况授予不同的权利,例如作为管理员,拥有所有权利,作为客户和供货商,拥有查询对应基本信息的权利。同时,在用户登录时,进入系统时也需要通过密码进行鉴别。通过本次实验,实现关于数据库的安全性控制,以防止不规范的操作导致数据泄露、更改和破坏,具有重要学习和使用意义。