MVC项目中用户权限的限制

MVC项目中用户权限的限制

开发工具与关键技术: MVC
作者:姚智颖
撰写时间:2020/08/16
注释:下面以机订票系统中角色维护功能为例,设置其中不同级别的用户在整个系统中一些功能的访问权限。

1.超级管理员的自定义,首先要保证系统中必须存在一个超级管理员的绝对权限,允许该管理员拥有整个系统的功能进行操作和修改,同时也要保证该管理员不能被其他用户修改,所以在系统中必须存在的那个超级管理员不能出现账户资料修改按钮。
在table 表格中返回修改单元中的屏蔽修改图标(页面上的屏蔽)。
在这里插入图片描述
在这里插入图片描述

权限过滤根据URL设置,一般URL是 : /区域名称/控制器名称/Action。浏览器拿到的字符串进行字符串分割,拿到区域名称、控制器名称、Action;在数据库中查找是否存在,把查找的结果在用户登录之后缓存到内存中再进行往后的查找。主页面主控制器一般放在权限过滤外面不会设置权限过滤,把区域放在里面。
2.新增角色与权限,用户权限的新增和修改,都是通过跳转其他页面的方式,权限功能不与其他功能一样使用模态框。
在这里插入图片描述

新增角色与权限的视图第一层就是设计了表格整体框架模块名称。
在这里插入图片描述
在这里插入图片描述
第二层是具体功能模块名称 – 对应的主要是控制器名称。
在这里插入图片描述
在这里插入图片描述

3.在勾选模块中添加通过构造函数,(JS new 构造函数,说明:构造函数也是种函数,但为了区分平常所用的函数,构造函数的函数名采用大骆驼峰写法(首字母大写)。
语法:var o = new ClassName()
原型:构造函数的prototype属性。)
设置一个类:ModuleID,添加了一个属性(moduleID)而且这个参数可传可不传。在C#中定义一个类是通过class关键字定义的,但是在JS中定义一个类就要通过方法定义。
在这里插入图片描述

定义一个[]数组遍历inputs,然后循环inputs.lehgth >0是否大于零,如果大于零就有勾选权限。
在这里插入图片描述

否则转到提示,提醒给改用户设置所需权限。
在这里插入图片描述
在这里插入图片描述

4.定义一个function方法,设置询问框,如果(msg.State)状态成功就提示操作成功,询问是否返回主页面,否则重新刷新页面。
在这里插入图片描述
5.在控制器中新增一个内部类,用于传递复杂对象的时候,可中页面中构建一个对象,把要传递的值放在对象里去,就可以传递复杂的数据或列表。
在这里插入图片描述

6.修改角色和权限,使用页面跳转的方法跳转到修改角色视图,修改角色页面布局和新增角色页面布局基本相同,只是修改要有把现有的权限去掉的功能,添加没有的权限,保持原有的权限不变3种。
在这里插入图片描述
在控制器中new一个匿名对象,使用JSON返回多个对象。
在这里插入图片描述
遍历:listpermission列表,进行for循环勾选模块信息。
在这里插入图片描述
用户角色ID作为修改的时候的主键,listModuleID是勾选的模块ID对象的数组(数据类型是 ModuleID对象的数组),
在这里插入图片描述
7.①需要新增的(数据库里面没有的) listModuleID中有,而oldModuleIDs中没有的
②需要删除的 listModuleID中没有,oldModuleIDs中有的
③保持不变的 listModuleID中有的,oldModuleIDs中也有的
在这里插入图片描述
在这里插入图片描述
比较保持不变的,新增的是new的部分减去交集部分,
删除的就是old减去交集部分,不变的就是交集部分。
在这里插入图片描述
7.删除角色,点击table表格中的删除按钮,删除该行数据。
在这里插入图片描述
判断是否有用户正在使用该账户,如果intUseUserCount等于零就删除,
在这里插入图片描述
执行删除,其中(removeList.Count + 1)是受影响行数和什么删除角色数据一样都是受影响行数。

8.应用权限模块,首先外连接所有的模块表,再连接读取用户拥有的模块表。
在这里插入图片描述
ID大于零就表示有该模块的权限,等于零表示没有该模块权限。
在这里插入图片描述
删除该用户没有的模块。
在这里插入图片描述
这种方法不安全,只是进行了页面的隐藏并没有在控制器中拦截权限,所以要用另外一种方法进行权限拦截。
在项目App_Start文件夹中添加一个类,
在这里插入图片描述
注册全局过滤器:
Static:修饰的方法是类的方法,不是实例方法,不需要对象的调用。
在这里插入图片描述
然后在项目的:Global.asax 里添加注册全局过滤器,过滤器原理:在控制器外面覆盖了一层代码(可以加N层),在没有过滤器的时候,浏览器是直接请求控制器中的方法,而加了过滤器之后,浏览器要想访问控制器中的方法必须要通过过滤器的信息比较才能访问,信息比较不正确该用户没有一部分的页面访问权限就重定向到没有权限的页面。
在这里插入图片描述
9.在项目里新建一个文件夹:Filter 然后新建一个类:PermissionFilter。
进行权限检查,首先获取用户所请求的是哪一个路径,
在这里插入图片描述
检查跳过登录前的一些不必要验证,比如验证码,
在这里插入图片描述
使用用户ID进行转换,如果能转换就继续向下进行权限检查,
在这里插入图片描述
在这里插入图片描述

如果转换失败,就执行到异常这里,Response(响应),就是把响应值重定向到登录页面。
在这里插入图片描述
在这里插入图片描述
其中有两种方法,第一种是需要在用户登录的时候只查询一次权限和相应的模块,获取在登录时查询的权限模块信息。但是存在一个问题就是,用户如果已经登录了,而管理员在用户登录后才修改该用户的权限,这时候该修改的权限不会生效。

第二种是每一次请求都查询一遍权限,第二种也存在问题,就是如果网站是大型网站数据复杂,而第二种方法是每操作一次就检查一次权限就会导致查询速度较慢,影响用户体验,当然第二种安全性较高。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Pzz_Lite/article/details/108074692