剑痴乎

  • 首页
  • 文章分类
    • 音视频
    • WebRTC
    • 编程之美
    • Linux
    • Windows
    • 生活点滴
    • 校园生活
  • 参考
    • API参考
    • 实用工具
    • 测试音视频
    • 文档
  • 留言板
  • 关于
剑痴乎
代码为剑,如痴如醉
  1. 首页
  2. 编程之美
  3. 正文

基于RBAC的大学学生成绩管理系统

2013年8月17日 1901点热度 0人点赞 0条评论

1.背景
当今社会是一个信息爆炸的社会,因为信息科技人们生活发生了巨大的变化,以计算机技术为代表的应用及普及到经济和社会生活的各个方面。这是属于一个大数据的时代,数据库系统几乎在每个领域都发挥着重大作用,用于加强对大量信息的管理,方便了人们的生活。

在大学里学生成绩管理如果靠人力将十分麻烦,有必要设计一个成绩管理系统,为了加强系统的安全性,引入了基于角色的访问控制模型(RBAC),应用该模型可以使不同用户登陆后得到不同的访问权限,不具有某个权限的用户将不能操作该权限,从数据库层进行权限控制有利于提高系统易用性,可扩展性,健壮性以及安全性。本次课程设计就是要设计一个基于RBAC的成绩管理系统,要从底层对用户权限进行控制,而不是在应用层。

2.系统需求分析
2.1需求描述
该成绩管理系统基于RBAC技术,能够对大学里各学生的成绩进行管理。系统有三个角色,分别是学生,教师以及管理员,管理员的权限最大。

学生通过该系统可以查询到自己某个课程的成绩,以及选择某个老师的某个课程。

教师可以录入所教课程学生的成绩,但不能修改,如果要修改只能联系管理员修改,还有查询有哪些学生选了他的课。

管理员拥有所有权限,包括删除用户,给用户重置登录密码,对各表的记录进行删除,增加,修改等。

该系统在微软的SQL SERVER 2008上进行开发,操作系统环境为Windows 7,通过写好的存储过程在数据库层完成各种操作,从而实现成绩管理。

2.2系统功能结构
系统功能结构图

2.3数据流图
RBAC-数据流图

3.数据库设计
3.1全局E-R图
ER图包括两个部分,一个有关用户权限分配,一个有关学生的成绩管理。
ER

3.2数据字典
rbac数据库管理系统
rbac
rbac

3.3数据库内关系表定义
用户信息(用户ID,用户名,用户密码)
用户-角色(用户ID,角色ID)
角色(角色ID,角色名)
角色—权限(角色ID,权限ID)
权限(权限ID,动作,对象,表名)
学生成绩(学号,课程号,姓名,成绩)
选课(课程号,课程名,学号,教师号)
教师(教师号,姓名,课程号)
加下划线的表示为主键。

4.数据库实现
4.1关系表(及相关视图)创建SQL代码
建立系统注册成员的信息表,包括用户唯一的账号,密码,姓名:

1
2
3
4
5
6
create table userinfo(
userid int,
username varchar(20),
userpwd varchar(20),
primary key(userid)
)

建立角色信息表:

1
2
3
4
5
create table role(
roleid int,
rolename varchar(20)
primary key(roleid)
)

建立用户角色联系的表:

1
2
3
4
5
6
7
create table user_role(
userid int,
roleid int,
foreign key(userid) references userinfo(userid) on delete cascade,
foreign key(roleid) references role(roleid) on delete cascade,
primary key(userid,roleid)
)

建立角色权限联系的表:

1
2
3
4
5
6
7
create table role_permit(
roleid int,
permitid int,
primary key(roleid,permitid),
foreign key(roleid) references role(roleid) on delete cascade,
foreign key(permitid) references permit(permitid) on delete cascade
)

建立权限信息表:

1
2
3
4
5
6
7
create table permit (
permitid int,
primary key(permitid),
action varchar(20),
object varchar(20),
tablename varchar(20)
)

建立学生成绩表,包括学号,姓名,课程号,成绩:

1
2
3
4
5
6
7
8
create table student(
    sno int,
    sname varchar(20),
    cno int,
    grade int,
    primary key(sno,cno),
    foreign key(cno) references course(cno) ,
)

建立教师表,包括教师号,姓名,课程名:

1
2
3
4
5
6
create table teacher(
    tno int,
    tname varchar(20),
    cno int,
    primary key(tno),
)

建立选课表:

1
2
3
4
5
6
7
8
create table course(
    cno int,
    course varchar(20),
    sno int,
    tno int,
    primary key(cno),
    foreign key(tno) references teacher(tno)
)

建立临时表,用于存储某个用户的权限:

1
2
3
4
5
6
7
create table temp(
    userid int,
    username varchar(20),
    action varchar(20),
    object varchar(20),
    tablename varchar(20),
)

4.2存储过程、触发器等的创建SQL代码
用户注册:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create procedure zuce
@userid int,@username varchar(20),@userpwd varchar(20)
as
if @userid in(select userid from userinfo)
begin
    print '该账号已被注册,注册失败!!!请更换账号重新注册'
end
else
   begin
      insert  into  userinfo(userid,username,userpwd)    
      values(@userid,@username,@userpwd)
      print '恭喜'+@username+'注册成功,欢迎使用本成绩管理系统'
      select userid as 用户ID,username as 用户姓名,userpwd as 密码 from userinfo where userid=@userid
   End

修改密码:

1
2
3
4
5
6
7
8
9
10
create procedure xiugaipwd
   @uid int,@pwd int,@newpwd int
   as
   if @pwd=(select userpwd from userinfo where @uid=userid)
   begin
       update userinfo set userpwd=@newpwd where @uid=userid
       print'密码修改成功'
   end
   else
       print'输入密码错误,请重新输入'

用户角色分配:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create procedure rolefenpei
@userid int,@roleid int
as
if exists(select * from user_role where userid = @userid)
begin
print '该用户原先已分配过其他角色,我们将重新分配角色'
delete from user_role where userid = @userid
insert into user_role values (@userid,@roleid);
select username,rolename from role,userinfo,user_role where userinfo.userid = user_role.userid and role.roleid = user_role.roleid
print '角色分配成功'
end
else
begin
    insert into user_role values (@userid,@roleid);
    select username,rolename from role,userinfo,user_role where userinfo.userid = user_role.userid and role.roleid = user_role.roleid
    print '角色分配成功'
end

角色权限分配:

1
2
3
4
5
6
7
8
9
10
11
12
13
create procedure permitfenpei
@roleid int,@permitid int
as
if exists (select * from role_permit where permitid = @permitid and roleid=@roleid)
begin
print '给角色已经分配了这个权限,无需再次分配'
end
else
begin
insert into role_permit values (@roleid,@permitid)
print '权限分配成功'
select rolename,action,object,tablename from role,permit,role_permit where role.roleid = role_permit.roleid and permit.permitid=role_permit.permitid;
End

删除角色某个权限:

1
2
3
4
5
6
create procedure deletepermit
@roleid int ,@permitid int
as
delete from role_permit where roleid=@roleid and permitid=@permitid
print '该角色此权限删除成功,其他权限为:'
select rolename,action,object from role,permit,role_permit where role.roleid = role_permit.roleid and permit.permitid=role_permit.permitid;

将某用户数据放入前面创建的一张临时表temp中,调用该存储过程可知用户有哪些权限:

1
2
3
4
5
6
7
8
create procedure user_permit
@userid int
as
delete from temp
insert into temp
select @userid,username,action,object,tablename from permit,userinfo,role_permit,user_role
where userinfo.userid=@userid and userinfo.userid = user_role.userid
and user_role.roleid = role_permit.roleid and permit.permitid =role_permit.permitid

从临时表得到数据,判断用户是否有此权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
create procedure permitif
@uid int ,@act varchar(20),@tna varchar(20),@obj varchar(20)
as
exec user_permit @uid
if exists(select @uid,@act,@tna,@obj from temp where @uid=userid and @act=action and @tna=tablename and @obj=object)
begin
    print'你拥有此权限,可以进行相关操作'
end
else
begin
     print'你无此操作权限,但你可以进行如下操作'
     select action,tablename,object from temp
end

安排教师教授某个课程,只有管理员有这权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create procedure jiaoke
  @uid int,@tno int,@tname varchar(20),@cno int
  as
  exec user_permit @uid
  if exists(select userid,action,tablename,object from temp where @uid=userid and action='增加' and tablename='course' and object='行')
  begin
      print'你拥有此权限,可以进行相关操作'
      insert into teacher values(@tno,@tname,@cno)
      select * from teacher
  end
else
begin
     print'你无此操作权限,但你可以进行如下操作'
     select action,tablename,object from temp
end

学生选课:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create procedure xuanke
  @uid int,@cno int,@course varchar(20),@sno int,@tno int
  as
  exec user_permit @uid
  if exists(select userid,action,tablename,object from temp where @uid=userid and action='增加' and tablename='course' and object='行')
  begin
      print'你拥有此权限,可以进行相关操作'
      insert into course values(@cno,@course,@sno,@tno)
      select * from course
  end
else
begin
     print'你无此操作权限,但你可以进行如下操作'
     select action,tablename,object from temp
end

往student表添加一行数据,即录入成绩,由前面的权限分配可知只有教师管理员有这权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create  procedure saddhan
@uid int,@sno int,@sname varchar(20),
@cno int,@grade int,@course varchar(20)
as
exec user_permit @uid
if exists(select @uid,action,tablename,object from temp where @uid=userid and action='增加' and tablename='student' and object='行')
begin
    print'你拥有此权限,可以进行相关操作'
    insert into student values(@sno,@sname,@cno,@grade)
    select sno,sname,cno,@course as course,grade from student where  sno=@sno and cno=@cno
end
else
begin
    print'你无此操作权限,但你可以进行如下操作'
    select action,tablename,object from temp
end

往student表删除某行数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create  procedure  sdelhan
@uid int,@act varchar(20),@tna varchar(20),@obj varchar(20),@sno int,@course varchar(20)
as
exec user_permit @uid
if exists(select @uid,@act,@tna,@obj from temp where @uid=userid and @act=action and @tna=tablename and @res=object)
begin
     print'你拥有此权限,可以进行相关操作'
     delete from course where sno=@sno and cno=@cno
end
else
begin
     print'你无此操作权限,但你可以进行如下操作'
     select action,tablename,object from temp
end

删除某个用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create  procedure deluser
@uid int,@uid1 int
as
exec user_permit @uid
if exists(select @uid,action,object from temp where @uid=userid and action='删除' and object='用户')
begin
     print'你拥有此权限,可以进行相关操作'
     delete from userinfo where userid=@uid1
end
else
begin
     print'你无此操作权限,但你可以进行如下操作'
     select action,tablename,object from temp
end

5.应用场景描述(SQL SERVER 2008模拟

在场景描述前我们先为该系统注册了三个用户,分别是张三(ID:1,学生),李四(ID:2,教师),王五(ID:3,管理员),角色信息表按如下初始化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
insert into role(roleid,rolename) values(1,'学生')
insert into role(roleid,rolename) values(2,'教师')
insert into role(roleid,rolename) values(3,'管理员')
权限信息表按如下初始化:
insert into permit values(1,'增加','行','student');
insert into permit values(2,'增加','列','student');
insert into permit values(3,'删除','行','student');
insert into permit values(4,'删除','列','student');
insert into permit values(5,'修改','行','student');
insert into permit values(7,'查找','表','student');
insert into permit values(8,'增加','行','course');
insert into permit values(9,'删除','行','course');
insert into permit values(10,'修改','行','course');
insert into permit values(11,'查找','行','teacher');
insert into permit values(12,'查找','表','teacher');
insert into permit values(13,'删除','行','teacher');
insert into permit values(14,'修改','行','teacher');
insert into permit values(15,'删除','用户','userinfo');
insert into permit values(16,'增加','行','teacher');

根据上述权限信息,我们给学生,教师,管理员分配了各种权限,示例场景如下:

1)给老师安排某个课程:
假设李四的教师号为2,我们要给李四安排教学1号课程,用到的存储过程为procedure jiaoke。

首先让学生张三安排,执行exec jiaoke 1,2,'李四','1',得到结果:
rbac
rbac

消息提示该用户无此权限,同时左侧结果提示拥有的权限,避免盲目操作。

同理2号用户作为老师的李四执行也是相同结果,接着安排管理员,3号用户王五执行:exec jiaoke 3,2,'李四','1',得到结果:
RBAC
RBAC

2)学生选课:

我们要给张三安排课程,假设安排的是课程号为1,课程名为计算机,李四老师上的课,对于选课,只有学生,管理员有这权限。

首先张三选课,假设张三学号为111,执行:

exec xuanke 1,1,'计算机',111,2,得到结果:

RBAC
RBAC

教师李四执行:exec xuanke 2,1,'计算机',111,2,结果为:

RBAC
RBAC

管理员执行时得到与学生相同的结果。

3)录入成绩

学生选完课后,就可以录入成绩了,此时只有老师管理员有此权限,首先让学生张三自己录入成绩,执行exec saddhan 1,111,'张三',1,95,’计算机’,系统提示无此操作权限。
rbac
rbac

2号教师执行:exec saddhan 1,111,'张三',1,95,’计算机’,得到结果:
rbac
rbac

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可
标签: 中南大学 物联网
最后更新:2018年12月23日

Jeff

管理员——代码为剑,如痴如醉

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

版权声明

为支持原创,创作更好的文章,未经许可,禁止任何形式的转载与抄袭,如需转载请邮件私信!本人保留所有法定权利。违者必究!

最近评论
ztt 发布于 3 周前(04月05日) 你好,想看里面的视频和图片为什么没有显示呢?需要下flash吗还是什么。
huowa222 发布于 1 个月前(03月26日) 同问
邱国禄 发布于 2 个月前(02月17日) Receive Delta以0.25ms为单位,reference time以64ms为单位,kDe...
啊非 发布于 4 个月前(12月30日) 大神,请教一个问题: constexpr int kBaseScaleFactor = Tran...
啊非 发布于 4 个月前(12月30日) reference time:3字节,表示参考时间,以64ms为单位,但是 代码里面是 Trans...
相关文章
  • 浅谈我们学校首届物联网专业
  • 密码保护:中南大学第一届物联网专业就业情况
  • 中南大学物联网专业简介
  • Google ProtoBuf协议介绍
  • Intel Media SDK 内存优化(转)

COPYRIGHT © 2024 jianchihu.net. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang