第四步:RBAC中权限过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 首先让我们认识权限过滤器是什么: 权限过滤器(Authorization Filters)是 ASP.NET MVC 框架中的一种功能,用于验证用户是否有权限访问特定的控制器或控制器方法。通过权限过滤器,你可以根据用户的身份、角色或其他条件来决定是否允许其执行某个操作。 在 ASP.NET MVC 中,权限过滤器是通过继承 System.Web.Mvc.FilterAttribute 类并实现 System.Web.Mvc.IAuthorizationFilter 接口或其派生接口来创建的。常见的权限过滤器有以下几种类型: AuthorizeAttribute:ASP.NET MVC 原生提供的权限过滤器,用于验证用户是否登录,并检查用户是否属于指定的角色或拥有指定的权限。 自定义权限过滤器:根据实际需要自行编写的验证用户权限的过滤器。 权限过滤器代码如下: public class MyAuthorizeFilter : IAuthorizationFilter //IAuthorizationFilter:权限过滤器 { public void OnAuthorization(AuthorizationFilterContext context) { //可以访问在应用程序启动时注册的各种服务和依赖项(:获取数据库上下文、日志记录器、身份验证服务等) var container = context.HttpContext.RequestServices; //any表示有任何一个满足就返回true,all表示全部都满足才返回true //如果所有元素的类型都不是 授权属性就返回true if (context.ActionDescriptor.EndpointMetadata.All(x => !x.GetType().Equals( typeof (AuthorizeAttribute)))) { return ; } //如果存在任何一个元素的类型等于 允许匿名属性 就返回true if (context.ActionDescriptor.EndpointMetadata.Any(x => x.GetType().Equals( typeof (AllowAnonymousAttribute)))) { return ; } var userRoleRep = container.GetService<IBaseRespository<UserRole>>(); //用户角色表 var rolePermRep = container.GetService<IBaseRespository<RolePerm>>(); //角色权限表 var permissionRep = container.GetService<IBaseRespository<Perm>>(); //权限表 //获取当前请求路径 var path = context.HttpContext.Request.Path; //1、获取当前用户 var principal = context.HttpContext.User; var claims = principal.FindFirst( "id" ); if (claims != null ) { var userid = int .Parse(claims.Value); //2.获取当前用户下的角色 var userRoleIds = userRoleRep.GetAll().Where(m=>m.UserId == userid).ToList().Select(m=>m.RoleId).ToArray(); //3.获取当前用户下角色的所有权限 var permissionIds = rolePermRep.GetAll().Where(m=> userRoleIds.Contains(m.RoleId)).ToList().Select(m=>m.PermId).ToArray(); var permissions = permissionRep.GetAll().Where(m => permissionIds.Contains(m.PermId)).ToList(); //4.根据权限判断当前用户访问的资源在不在权限列表中 var hasPermision = permissions.Any(m=>m.PermPath.Equals(path)); if (!hasPermision) { //context.Result = new ForbidResult(); //这种用在服务器端,直接返回http的code401 //以下用于前后端分离下返回前端数据,让前端来处理提示异常信息 context.Result = new ObjectResult( new ResulrWapper { code = 401, message = "访问被拒绝" }); } } } } 最后创建一个显示页面,如果用户没没有权限的话,就提示没有权限访问,可以结合导航守卫一起使用 |
分类:
RBAC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具