ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(7)

今天将使用Simplemembership进行权限控制

我们使用mvc的AuthorizeAttribute来实现对Controller and Action权限控制

看如下标为红色的代码片段:

 /// <summary>
        /// 删除数据操作
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
         [MVCSystemAuthorizeAttribute(permission = "删除")]
        [HttpPost]
        public JsonResult ArticlesDelete(int id)
        {
            if (id > 0)
            {
                var aList = db.DB_Articles.Find(id);
                db.DB_Articles.Remove(aList);
                db.SaveChanges();
                return Json(1, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(0, JsonRequestBehavior.AllowGet);
            }
        }
        /// <summary>
        /// 添加修改
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [MVCSystemAuthorizeAttribute(permission = "添加")]
        public ActionResult ArticleAddEdit(int id)
        {
            ViewBag.Type = db.DB_ArticleTypes.ToList();
            ViewBag.Member = db.DB_Members.ToList();
            if (id == 0)
            {

                var aList = new M_Articles();
                return View(aList);
            }
            else {
                var aList = db.DB_Articles.Find(id);
                return View(aList);
            }
        }

从之前生成的表可以看出,Permission表存储各个Action的名字(例如一个一个controller中的曾删改查各个Action),PermissionsInRoles表就是存储权限和角色关系。

然后我们在Filters/InitializeSimpleMembershipAttribute.cs中建立一个自己的MVCSystemAuthorizeAttribute继承AuthorizeAttribute,并重写AuthorizeCore和HandleUnauthorizedRequest方法。

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.Web.Mvc;
using WebMatrix.WebData;
using MVCSystem.Web.Models;
using MVCSystem.Web.Common;
using System.Web;

namespace MVCSystem.Web.Filters
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
    {
        private static SimpleMembershipInitializer _initializer;
        private static object _initializerLock = new object();
        private static bool _isInitialized;

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // 确保每次启动应用程序时只初始化一次 ASP.NET Simple Membership
            LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
        }

        private class SimpleMembershipInitializer
        {
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer<MVCSystemContext>(null);

                try
                {
                    using (var context = new MVCSystemContext())
                    {
                        if (!context.Database.Exists())
                        {
                            // 创建不包含 Entity Framework 迁移架构的 SimpleMembership 数据库
                           // ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }

                    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("无法初始化 ASP.NET Simple Membership 数据库。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }
        }
    }
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class MVCSystemAuthorizeAttribute : AuthorizeAttribute
    {
        private bool _authorize;

        private bool _isPermissionFail = false;

        public string permission { get; set; }

        public MVCSystemAuthorizeAttribute()
        {
            if (HttpContext.Current.User.Identity.Name != "")
            {
                _authorize = true;
            }
            else
            {
                _authorize = false;
            }
        }

        public MVCSystemAuthorizeAttribute(string permission)
        {
            if (HttpContext.Current.User.Identity.Name != "")
            {
                _authorize = PermissionManager.CheckUserHasPermision(HttpContext.Current.User.Identity.Name, permission);
                if (_authorize == false)
                {
                    _isPermissionFail = true;
                }
            }
            else
            {
                _authorize = false;
            }
            //_authorize = true;
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
            {
                throw new ArgumentNullException("HttpContext");
            }
            if (!httpContext.User.Identity.IsAuthenticated)
            {
                return false;
            }
            else
            {
                _authorize = PermissionManager.CheckUserHasPermision(HttpContext.Current.User.Identity.Name, permission);
                if (_authorize == false)
                {
                    _isPermissionFail = true;
                    return false;
                }
                return true;
            }
            // return false;
        }
        //protected override bool AuthorizeCore(HttpContextBase httpContext)
        //{
        //    return _authorize;
        //}

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
        }
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (_isPermissionFail)
            {
                filterContext.HttpContext.Response.Redirect("/Admin/Error/ErrorNoper");
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }

        }
    }
}

MVCSystemAuthorizeAttribute(string permission)接受一个permission字符串,这个就是Permission表中的数据,对应的每个Action【增删查改】等名称。

在这个构造参数里判断当前用户是否具有permission这个权限。PermissionManager.CheckUserHasPermision(HttpContext.Current.User.Identity.Name, permission),如果有赋值true给_authorize,表示当前用户有权限访问这个Action。如果没有赋值false给_authorize。

然后我们在common中创建一个类PermissionManager.cs,用来获取登录用户的角色权限:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using MVCSystem.Web.Models;

namespace MVCSystem.Web.Common
{
    public class PermissionManager
    {
        public static bool CheckUserHasPermision(string userName, string permissionName)
        {

            using (MVCSystemContext db = new MVCSystemContext())
            {

                var userId = db.DB_UserProfiles.Single(u => u.UserName == userName).UserId;
                var roleIdList =db.DB_UsersInRoles.Where(k=>k.UserId==userId).ToList();
                foreach (var roles in roleIdList)
                {
                    var permissionList = (from m in db.DB_PermissionsInRoles
                                          where m.RoleId == roles.RoleId
                                          join n in db.DB_Permission
                                              on m.PermissionId equals n.PermissionId into pp
                                          from p in pp.DefaultIfEmpty()
                                          select new
                                          {
                                              PermissionName = (p.PermissionName == null) ? "" : p.PermissionName
                                          }).ToList();

                    foreach (var permission in permissionList)
                    {
                        if (permission.PermissionName == permissionName)
                        {
                            return true;
                        }
                    }
            }
            }

            return false;
        }
    }
}

这里需要注意的是var roleIdList =db.DB_UsersInRoles.Where(k=>k.UserId==userId).ToList();这句话,ToList()去掉之后会出现数据库已经打开,这里不能打开的错误【已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭】!

然后,我设置当前我登录的账户角色,这里我选择“一般管理员”,而这个角色只有查看数据列表的权限,没有增删改的权限,运行结果如下:

到了这一步,后台搭建的功能基本完成了,接下里主要是完善前台网站的页面,只要有一个漂亮的前端界面,那么接下来的代码工作将会是最简单的了。

作者:boyzi007

出处:http://www.cnblogs.com/boyzi/

QQ:470797533

QQ交流群:364307742
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

时间: 2024-10-11 15:43:27

ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(7)的相关文章

ASP.NET MVC4.0+EF+LINQ+EasyUI+网站+角色权限管理系统(1)

本系列的的角色权限管理主要采用Dotnet MVC4工程内置的权限管理模块Simplemembership实现,主要有关文件是InitializeSimpleMembershipAttribute.cs和AccountModels.cs 下面是对这两个文件的了解和改造 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", &qu

ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(3)

接下来完成用户.角色的增删查改,以及用户角色.权限的设置 对用户表.角色表做了一些扩展如下[可以更加自己需要增减字段] 相应的M_UserProfile.cs.M_Roles.cs进行扩展 using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Syst

[MVC4]ASP.NET MVC4+EF5(Lambda/Linq)读取数据

继续上一节初始ASP.NET MVC4,继续深入学习,感受了一下微软的MVC4+EF5(EntityFramework5)框架的强大,能够高效的开发出网站应用开发系统,下面就看一下如何用MVC4+EF5来实现数据的读取. 实现效果 操作步骤 1.创建数据库 --创建表格-- Create table News ( id int identity(1,1) primary key, NewsTitle varchar(100)not null, CreateTime Datetime, Conte

Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framework框架下的实体框架(Entity Framework)数据访问技术,与模型类协同工作.实体框架(常简称为EF)支持一种称之为编码先行(Code First)的开发模式.编码先行使你通过编写简单的类(简称为POCO类,全称为"plain-old CLR objects."),来创建模型对象

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架、二维码自定义、Bootstrap视图)视频教程

Asp.Net MVC4.0 从入门到精通与项目实战 (Petapoco框架.二维码自定义.Bootstrap视图)视频教程下载    联系QQ:1026270010 Asp.Net MVC 简介      MVC模式是“Model-View-Controller”的缩写,中文翻译为“模式-视图-控制器”.MVC模式是于20世纪70年代在smaltalk80的GUI设计中被提出的.它包括3个部分:模型(Model).视图(View)和控制器(Controller).MVC模式至今已被广泛使用,A

IIS发布ASP.NET MVC4.0教程

本文主要讲解在微软的IIS Web服务器上发布ASP.NET MVC4.0的项目的方法以及注意事项. 首先介绍如何打开IIS服务器. 打开IIS 在命令行中输入 Inetmgr 既可以打开IIS了,界面如下: 再来谈谈如何查看自己的IIS版本号. IIS版本 在IIS工具的帮助下拉框中,选择 关于internet信息服务 发布 接下来就介绍如何发布ASP.NET MVC4.0项目到IIS8.5 Web服务器上的流程. 首先进入VS中,选择项目中的引用部分,全部选中,将属性中的复制本地全部设为tr

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类. · Views: 应用程序动态生成 HTML所使用的模板文件. · Controllers: 处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板. 本系列教程,我们将覆盖所有这些概念,并告诉

无废话版本-Asp.net MVC4.0 Rasor的基本用法

最近工作有点忙,好久没写东西了!废话不多说了,进入主题! 1.在页面中输出单一变量时候,只要在C#语句之前加上@符号即可,For example: <p>Now Time:@DateTime.Now</p> 请注意,上述example中虽然使用C#语言撰写代码,但输出单一变量的时候,不需要加上分号: 2.在页面上输出一段含有空白字元或者运算子的结果时,必须在前后加上一个小括号,For example: <p> UserName:@(User.Identity.Name+

ASP.NET MVC4.0+ WebAPI+EasyUI+KnockOutJS快速开发框架 通用权限管理系统

在线演示地址:http://115.28.135.49:8099/ 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件工程化管理等优点 3.采用WebAPI,客户端完全摆脱了代理和管道来直接进行交互 4.采用EasyUI前台UI界面插件,可轻松的打造出功能丰富并且美观的UI界面 5.采用Knockout,,提供了一个数据模型与用户UI界面进行关联的