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 > )
{
var aList = db.DB_Articles.Find(id);
db.DB_Articles.Remove(aList);
db.SaveChanges();
return Json(, JsonRequestBehavior.AllowGet);
}
else
{
return Json(, 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 == )
{ 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,必须首先将它关闭】!
然后,我设置当前我登录的账户角色,这里我选择“一般管理员”,而这个角色只有查看数据列表的权限,没有增删改的权限,运行结果如下:







到了这一步,后台搭建的功能基本完成了,接下里主要是完善前台网站的页面,只要有一个漂亮的前端界面,那么接下来的代码工作将会是最简单的了。
源码下载:http://www.yealuo.com/Sccnn/Detail?KeyValue=2f926407-f80b-4bff-a729-949a53efed7b
作者:boyzi007
出处:http://www.cnblogs.com/boyzi/
QQ:470797533
QQ交流群:364307742
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(7)的更多相关文章
- ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(6)
		
快过年了,公司事情忙,好几天没有继续写博客,今天开始写账户模块系统登录,账户管理以及登录日志, 首先新建登录日志数据表: USE [MVCSystem] GO /****** Object: Tabl ...
 - ASP.NET MVC4.0+EF+LINQ+bui+网站+角色权限管理系统(5)
		
我参考了bui官网,里面提供了大量的接口案例和效果,之前下载的前端框架完全不需要bootstrap,所以从这一节开始,不再使用bootstrap(当然不想改变的也可以继续使用之前的框架,不影响使用), ...
 - ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(1)
		
本系列的的角色权限管理主要采用Dotnet MVC4工程内置的权限管理模块Simplemembership实现,主要有关文件是InitializeSimpleMembershipAttribute.c ...
 - ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(3)
		
接下来完成用户.角色的增删查改,以及用户角色.权限的设置 对用户表.角色表做了一些扩展如下[可以更加自己需要增减字段] 相应的M_UserProfile.cs.M_Roles.cs进行扩展 using ...
 - ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(4)
		
接下来就是菜单管理了,菜单分为两部分,一部分是菜单管理,另一部分是左边的树形菜单 数据库添加菜单表Menus USE [MVCSystem] GO /****** Object: Table [dbo ...
 - ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(2)
		
创建公共分页参数类Common/GridPager.cs using System; using System.Collections.Generic; using System.Linq; usin ...
 - ASP.NET MVC4.0+EF+LINQ+bui+bootstrap+网站+角色权限管理系统(开篇)
		
系统预览: 源码下载:http://www.yealuo.com/Home/Detail?KeyValue=2f926407-f80b-4bff-a729-949a53efed7b 创建项目,新手按步 ...
 - 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码
		
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(5)-EF增删改查by糟糕的代码 上一讲我们创建了一系列的解决方案,我们通过一个例子来看看层与层之间的关系 ...
 - Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型
		
Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...
 
随机推荐
- day39 07-Spring的AOP:自动代理
			
带有切点的切面或者是不带有切点的切面配置一个类就要配置一段生成代理的代码,这样太麻烦了. 选中orderDao右键watch JDK动态代理是先创建被代理对象,然后在创建代理对象的时候传入被代理对象. ...
 - oralce如何修改默认的XDB监听端口
			
Oracle9i默认的XML DB把HTTP的默认端口设为8080,这是一个太常用的端口了,很多别的WebServer都会使用这个端口, 如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好 ...
 - zend studio打开文件提示unsupported character encoding
			
zend studio打开文件提示unsupported character encoding,是文件的编码方式错误. 有可能是PHP代码中,charset={CHARSET} ,用了变量的形式调用编 ...
 - AI种黄桃AI卖黄桃 阿里巴巴推进一站式政务服务
			
7月11日,武汉城市峰会期间,武汉.枣阳.荆门等多个城市发布了同阿里巴巴的最新合作.这些合作包括用人工智能改善武汉交通拥堵.降低枣阳黄桃种植成本.提升荆门城市治理和市民服务水平等.阿里云.蚂蚁金服.高 ...
 - 登录注册beta版
			
注册 login_count = 0 username_inp = input('请输入用户名:') while login_count < 3: pwd_inp = input('请输入密码: ...
 - navicat 导入SQL文件出错
			
1.新建数据库 在数据库名或者表名上右键 运行SQL语句 2.去掉对勾 F5刷新则可以发现导入的表.
 - *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<_UIFeedbackParameters 0x1d4442e50> setNilValueForKey]: could not set nil as the value for the key rate.'
			
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<_UIFeedbac ...
 - 使用epoll实现简单的服务器
			
1. 头文件 #ifndef __TCP_SERVER_H__ #define __TCP_SERVER_H__ #include <unistd.h> #include <stdi ...
 - BUAA 169 电话费
			
http://oj55.bianchengla.com/problem/169/ 还有这个,不怎么好做,最后用栈做出来了. 感觉比较有用的一个数据是: 10 3 1010101010 代码如下: #i ...
 - UITableView 刷新问题
			
遇到的问题: 在程序里异步请求服务器后回调函数中处理数据和界面数据的刷新,但是更新UITableView的时候总是很慢才更新完,打印TableView的代理方法也都很快打印. 解决办法就是: [sel ...