过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等。博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚。禁止吸烟 如果对过滤器还没有概念的童鞋,不妨先看看前面各位前辈的介绍(前面的文章说得已经很好了,而我是想写一个较为完整的例子)。
此文仅作为个人学习笔记整理,如果有幸对你有所帮助,不胜荣幸。如果文中有错误的地方,感谢指正。
如果在个人前期学习阶段,使用MVC自带的身份验证,给人的感觉就是无法自己达到自己想要的控制效果,掌握起来比较麻烦。往往在一个小的作为学习MVC的项目里面,反而自己写一个过滤器来实现相关的功能,反而觉得整个学习思路比较清晰。该实例的身份验证过滤器支持三种验证方式:
1.游客(每个人都可以访问)
2.用户(注册的用户)
3.管理员(后台管理)
一、先来看看数据库
定义了一个基础的用户表,右侧是一个权限表。右侧的权限表是固定的,一开始就把我们的权限规则数据填充在里面。设置RoleId这个字段是为了待会方便我们判断权限。
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.ComponentModel.DataAnnotations; 5 using System.ComponentModel.DataAnnotations.Schema; 6 using System.Linq; 7 using System.Web; 8 9 namespace MyAuthorizen.Models 10 { 11 [Table("User")] 12 public class User 13 { 14 [Key] 15 public int UserId { get; set; } 16 17 [DisplayName("用户名")] 18 [Required(ErrorMessage="用户名是必填字段")] 19 public string Name { get; set; } 20 21 [DisplayName("密码")] 22 [DataType(DataType.Password)] 23 [Required(ErrorMessage="密码是必填字段")] 24 public string Password { get; set; } 25 26 [DisplayName("昵称")] 27 public string AuthName { get; set; } 28 29 public int RoleId { get; set; } 30 31 public virtual Roles Role { get; set; } 32 } 33 34 public class LoginModel 35 { 36 [DisplayName("用户名")] 37 [Required(ErrorMessage = "用户名是必填字段")] 38 public string Name { get; set; } 39 40 [DisplayName("密码")] 41 [DataType(DataType.Password)] 42 [Required(ErrorMessage = "密码是必填字段")] 43 public string Password { get; set; } 44 } 45 46 public class RegisterModel 47 { 48 [DisplayName("用户名")] 49 [Required(ErrorMessage = "用户名是必填字段")] 50 public string Name { get; set; } 51 52 [DisplayName("密码")] 53 [DataType(DataType.Password)] 54 [Required(ErrorMessage = "密码是必填字段")] 55 public string Password { get; set; } 56 57 [DisplayName("确认密码")] 58 [DataType(DataType.Password)] 59 [Required(ErrorMessage = "密码是必填字段")] 60 [Compare("Password", ErrorMessage = "密码和确认密码不匹配。")] 61 public string ConfirmPassword { get; set; } 62 63 public int RoleId { get; set; } 64 65 public virtual Roles Role { get; set; } 66 } 67 }