不同类型用户功能区权限的限制处理
开发工具与关键技术:VisualStudio MVC
作者:老龙
撰写时间:2019/5/8
对于一个项目来说,不同类型的用户就需要对权限进行限制,比如学生的的权限是只能查看自己的考试成绩而不能修改自己的成绩。当存在管理员,校长,教师,学生等不同类型的用户时,我们就分别限制他们权限,让他们的没有权限的区域不可视化。
功能模块权限限制第一种方法:
一、 控制器方法总结:
- 传输参数。在下面的查询里我们需要将表里查询处理的用户ID与方法的ID进行匹配,所以在写方法时传输一个用户ID。
- 连表查询数据。由于要实现用户对应功能区的限制,那就需要将用户表和对应的功能模块表,具体的权限操作表等表格进行连接。
- 查询出要全部的功能区。在页面写限制权限之前首先要查询出功能区的ID和具体模块名称。
- 返回查询查询的数据。
二、 页面方法总结 - 获取用户ID。由于之前在写页面账号登录时就用户的ID存入了Session里,所以可以直接从Session里将用户ID提取出来。
var UserID=@Session["UserID"];//获取用户ID
- 设置参数明确用户信息。因为需要向控制器的方法提交请求来绑定控制器的方法与页面方法的关系,所以我们也需要在页面设置一个参数代表用户ID。
- 确定提交方式向控制器提交请求,并根据时间进行实时提交。在这里需要好确认好使用哪种提交方式。是post提交、get提交,还是getJSON的提交方式,在我的的代码里用的是getJSON的提交方式。
- 利用提交方式的回调函数将所有的模块隐藏后利用循环根据用户类型将该有的模块显示出来。循环时是根据是否有这么模块的ID控制权才将它显示出来,在循环显示功能区模块的过程中使用each传输数据,并在回调函数里使用了switch case将模块显示。
设置用学生账号与管理员账号登陆后的功能模块效果图对比
功能模块权限限制第二种方法:
一、 控制器方法:
- 判断Session中的用户ID是否为空,当不为空时执行查询方法,为空时返回空值。
- 左连接查询。第二种方法前面部分的查询与第一种方法的代码和思路是一模一样的,不同之处就在与第二种方法比第一种方法多了一个左连接。 由于我们要查询出功能区模块,当不使用左连接时默认的查询方式会导致数据不完整的模块查询不出来,这是不被允许的,所有使用了一个左连接
。
左连接简介:当有两个表进行主键与外键的连接查询时,左连接是将数据的来源设置为左边的表,当右边的表与左边的表数据相同部分出现的残缺时会在缺失的位置自动生成一个null,并不会影响到数据的查询。而不设置默认的连表查询方式时查询两个表共有的部分,也就是一种交集的关系。当有一边的数据出现残缺时会自动将这条数据过滤掉。 - 将与第一种方法查询一样的前半部分再次与模块表进行连接查询出需要的模块ID与模块名字,并对前面查询出的ID进行二次赋值。
- 返回查询结果。
二.页面方法:
1.用键值对的方式获取到功能区的所有模板菜单。在这个页面方法里不需要获取Session里的UserID,而且它是直接先通过ID获取到所有的功能区模板菜单,与第一种方法里先将所有模板隐藏的做法不同。
2.向控制器提交请求,并设置为实时提交。这里的提交方式没有特别的限制,post提交,get提交,getJson的提交方式都可以。
3.在提交方法的回调函数里进行循环,将没有操作权限部分的功能区进行移除。在进行循环删除功能区模块时我们需要对回调函数传进来的数据进行判断。若是获取到都模块ID为空就不进行循环并跳到空白页面,否则进行循环。
总结: 第一种方法与第二种方法有很大的区别。在控制器方法上前者需要传输用户ID的参数到页面方法上。而后者则不需要。在页面方法上第一种方法的基本思路是先将所有的功能区模块隐藏,然后再根据功能区模块的权限ID进行匹配,当有权限时就显示出来,没有时就继续隐藏。不管有没有都需要将所有的模块show出来,只是由权限ID决定是显示还是隐藏,当有上百个功能区是这个方法就显得操作繁杂,效率低。而第二种方法是先将所有的模块获取到,再利用循环匹配权限ID将没有权限的部分直接进行删除,就不需要将模块一个一个地写出来,较为简便实用。