ASP.NET MVC5+三层架构+AutoFac搭建简单权限管理系统
- 一. 前言
- 二. 简单权限系统数据库设计
- 三. MVC5三层架构搭建
- 四. 使用CodeFirst添加数据库迁移
- 五. 使用AutoFac实现依赖注入
- 六. 实现系统登录
- 七. Filter实现权限过滤
- 八. Filter实现异常处理
- 九.主页菜单目录动态生成
- 十.其他功能补充
一. 前言
该系统为入门级别的权限管理系统,仅适用于小型项目。
二. 简单权限系统数据库设计
对于小型项目,而且角色相对固定且角色具体权限长时间内不会修改的系统,管理员不需要为角色配置具体访问权限时,数据库可以只使用蓝色方框中的三张表即可(这样并不灵活)。若需要开放权限配置功能,则至少需要5张表(PowerInfo包括菜单目录和具体方法访问权限,考虑到入门阶段,本项目的PowerInfo只维护菜单目录)。
注意:在这里暂时不讨论Asp.Net Identity.
三. MVC5三层架构搭建
新建一个空的MVC项目,不需要任何模板。
搭建项目架构如图所示:(在这里并没有使用数据仓储,小型项目没必要,降低开发效率)
引用关系为
MVC引用 : IService、Service、DataEntity、ModelEntity、Utilty
IService引用 :DataEntity、ModelEntity
Service引用 : DataEntity、ModelEntity、Utilty
四. 使用CodeFirst添加数据库迁移
首先添加EF 的nuget包
就目前来说,实际开发中一般是先设计数据库,或者设计数据库的工作由DBA完成,然后使用基于数据库的CodeFirst即可。为了跟风,还是勉为其难的用一下纯CodeFirst(看个人习惯)。
以下为codefirst的一些简单命令:
1、启用迁移 Enable-Migrations
2、为挂起的Model变化添加迁移脚本 Add-Migration 名字
3、将挂起的迁移更新到数据库 Update-Database
4、将数据库迁移到指定版本 Update-Database –TargetMigration: 名字
使用EF应该注意的问题:应保证EF对象线程内唯一或者作用域内唯一
解决方案一:把EF对象存到HttpContext对象中,实现EF对象线程内唯一
解决方案二:使用IOC容器实现作用域内唯一
五. 使用AutoFac实现依赖注入
首先添加NuGet程序包
在Global文件注册AutoFac的配置类,注入方式任选,这里使用的是属性注入(点击进入官方文档)
如果使用仓储模式可以使用扫描程序集的方式进行AutoFac模块化注册。
六. 实现系统登录
登录成功后,获取用户所有的角色ID,并用逗号分隔开来,形成新字符串(例如“R1001,R1003”),存到Session中备用。
七. Filter实现权限过滤
在我们开发的系统中:我们希望有些方法用户不需要登陆就能访问,有些只需要登录就能访问,有些必须是登录了并且特定的角色才能访问,怎么办?
写一个继承ActionFilterAttribute的特性类,重写行为前过滤器。实现Seesion登录权限校验和基于角色权限的校验功能。
把需要权限校验的方法或控制器上标记特性。
八. Filter实现异常处理
写一个继承HandleErrorAttribute的特性类,重写异常处理过滤器(逻辑可以自己设计,比如把报错信息写入txt或者数据库,然后返回错误页面或者直接返回错误信息,可以结合Log4net组件,自由发挥吧),最后全局注册一下这个异常处理过滤器即可。
九.主页菜单目录动态生成
根据登录用户的角色ID字符串(例如“R1001,R1003”),R_RoleInfo_PowerInfo与PowerInfo连表并查出对应的菜单目录,进行去重处理,在UI页面动态生成即可。
十.其他功能补充
接下来还需要做用户信息增删查改、为用户配置角色。一个简单版的完整的权限功能就算完成。