基于MVC4 EasyUI的Web开发框架形成之旅权限控制Word文件下载.docx
- 文档编号:22536027
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:18
- 大小:20.82KB
基于MVC4 EasyUI的Web开发框架形成之旅权限控制Word文件下载.docx
《基于MVC4 EasyUI的Web开发框架形成之旅权限控制Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于MVC4 EasyUI的Web开发框架形成之旅权限控制Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
data:
postData,
cache:
false,
async:
true,
type:
post'
success:
function(data){
if(data=="
OK"
){
window.location.href="
/Home/Index"
;
}else{
alert(data);
/Login/Index"
}
});
用户登录的后台控制器方法如下所示:
///&
lt;
summary&
gt;
///对用户登录的操作进行验证
/summary&
paramname="
username"
&
用户账号&
/param&
password"
用户密码&
code"
验证码&
returns&
/returns&
publicActionResultCheckUser(stringusername,stringpassword,stringcode)
{
stringresult="
"
boolcodeValidated=true;
if(this.TempData["
ValidateCode"
]!
=null)
codeValidated=(this.TempData["
].ToString()==code);
}if(string.IsNullOrEmpty(username))
result="
用户名不能为空"
elseif(!
codeValidated)
验证码输入有误"
else
stringip=GetClientIp();
stringmacAddr="
stringidentity=BLLFactory&
WHC.Security.BLL.User&
.Instance.VerifyUser(username,password,MyConstants.SystemType,ip,macAddr);
if(!
string.IsNullOrEmpty(identity))
UserInfoinfo=BLLFactory&
.Instance.GetUserByName(username);
if(info!
Session["
UserInfo"
]=info;
Identity"
]=info.Name.Trim();
#region取得用户的授权信息,并存储在Session中List&
FunctionInfo&
functionList=BLLFactory&
Function&
.Instance.GetFunctionsByUser(info.ID,MyConstants.SystemType);
Dictionary&
string,string&
functionDict=newDictionary&
();
foreach(FunctionInfofunctionInfoinfunctionList)
string.IsNullOrEmpty(functionInfo.ControlID)&
amp;
!
functionDict.ContainsKey(functionInfo.ControlID))
functionDict.Add(functionInfo.ControlID,functionInfo.ControlID);
Functions"
]=functionDict;
#endregion
用户名输入错误或者您已经被禁用"
}returnContent(result);
从上面的代码,我们可以看到,在用户登录成功后,后台把用户信息、用户权限列表信息放到了Session里面,方便进行后面的权限控制。
然后当前端页面获得成功响应并切换到Home的Index视图前,后台会调用Home的控制器,把一些用户信息放到了ViewBag对象里面,并构造用户的相关菜单项目,代码如下所示。
publicclassHomeController:
BaseController
publicActionResultIndex()
if(CurrentUser!
ViewBag.FullName=CurrentUser.FullName;
ViewBag.Name=CurrentUser.Name;
StringBuildersb=newStringBuilder();
List&
MenuInfo&
menuList=BLLFactory&
Menu&
.Instance.GetTopMenu(MyConstants.SystemType);
inti=0;
foreach(MenuInfomenuInfoinmenuList)
sb.Append(GetMenuItemString(menuInfo,i));
i++;
ViewBag.HeaderScript=sb.ToString();
//一级菜单代码
returnView();
2、控制器方法权限控制
我们知道,对页面的权限控制,可以分为前端控制和后台代码的控制,控制器方法的权限控制属于后台代码的控制。
为了方便基类代码的权限控制,我们定义一个权限控制键的类,用来记录通用的增加、修改、删除、查看、列表、导出等传统控制元素,代码如下所示。
///定义常用功能的控制ID,方便基类控制器对用户权限的控制
[DataContract]
[Serializable]
publicclassAuthorizeKey
#region常规功能控制ID
///新增记录的功能控制ID
publicstringInsertKey{get;
set;
}///&
///更新记录的功能控制ID
publicstringUpdateKey{get;
///删除记录的功能控制ID
publicstringDeleteKey{get;
///查看列表的功能控制ID
publicstringListKey{get;
///查看明细的功能控制ID
publicstringViewKey{get;
///导出记录的功能控制ID
publicstringExportKey{get;
}
#endregion#region常规权限判断
///判断是否具有插入权限
publicboolCanInsert{get;
///判断是否具有更新权限
publicboolCanUpdate{get;
///判断是否具有删除权限
publicboolCanDelete{get;
///判断是否具有列表权限
publicboolCanList{get;
///判断是否具有查看权限
publicboolCanView{get;
///判断是否具有导出权限
publicboolCanExport{get;
}#endregion///&
///默认构造函数
publicAuthorizeKey(){}///&
///常用构造函数
publicAuthorizeKey(stringinsert,stringupdate,stringdelete,stringview="
)
this.InsertKey=insert;
this.UpdateKey=update;
this.DeleteKey=delete;
this.ViewKey=view;
有了这个实体类,我们就可以在控制器的基类BaseController里面实现一些控制逻辑了。
首先我们在控制器每次执行方法前,都对权限进行一个转换,并把控制键存储到ViewBage里面,方便前端页面的控制,如下代码所示。
///重新基类在Action执行之前的事情
filterContext"
重写方法的参数&
protectedoverridevoidOnActionExecuting(ActionExecutingContextfilterContext)
base.OnActionExecuting(filterContext);
//得到用户登录的信息
CurrentUser=Session["
]asUserInfo;
if(CurrentUser==null)
Response.Redirect("
);
//如果用户为空跳转到登录界面
}//设置授权属性,然后赋值给ViewBag保存
ConvertAuthorizedInfo();
ViewBag.AuthorizeKey=AuthorizeKey;
其中ConvertAuthorizedInfo()函数是验证登陆用户是否具有相应的权限的。
///对AuthorizeKey对象里面的操作权限进行赋值,用于页面判断
protectedvirtualvoidConvertAuthorizedInfo()
//判断用户权限
AuthorizeKey.CanInsert=HasFunction(AuthorizeKey.InsertKey);
AuthorizeKey.CanUpdate=HasFunction(AuthorizeKey.UpdateKey);
AuthorizeKey.CanDelete=HasFunction(AuthorizeKey.DeleteKey);
AuthorizeKey.CanView=HasFunction(AuthorizeKey.ViewKey);
AuthorizeKey.CanList=HasFunction(AuthorizeKey.ListKey);
AuthorizeKey.CanExport=HasFunction(AuthorizeKey.ExportKey);
其中BaseController的控制器基类还定义了判断用户是否有某些权限的逻辑,如果没有没有权限,就会抛出自定义异常(MyDenyAccessException),代码如下。
///用于检查方法执行前的权限,如果未授权,返回MyDenyAccessException异常
functionId"
protectedvirtualvoidCheckAuthorized(stringfunctionId)
if(!
HasFunction(functionId))
stringerrorMessage="
您未被授权使用该功能,请重新登录测试或联系管理员进行处理。
thrownewMyDenyAccessException(errorMessage);
有了上面的这些逻辑,我们在业务控制器基类(BusinessController&
B,T&
)里面,就可以实现对一些基本操作的API的权限控制了。
///本控制器基类专门为访问数据业务对象而设的基类
typeparamname="
B"
业务对象类型&
/typeparam&
T"
实体类类型&
publicclassBusinessController&
:
whereB:
class
whereT:
WHC.Framework.ControlUtil.BaseEntity,new()
{///&
///插入指定对象到数据库中
info"
指定的对象&
执行操作是否成功。
publicvirtualActionResultInsert(Tinfo)
//检查用户是否有权限,否则抛出MyDenyAccessException异常
base.CheckAuthorized(AuthorizeKey.InsertKey);
boolresult=false;
result=baseBLL.Insert(info);
returnContent(result);
///更新对象属性到数据库中
id"
主键ID的值&
执行成功返回&
c&
true&
/c&
,否则为&
false&
。
publicvirtualActionResultUpdate(stringid,FormCollectionformValues)
base.CheckAuthorized(AuthorizeKey.UpdateKey);
Tobj=baseBLL.FindByID(id);
if(obj!
//遍历提交过来的数据(可能是实体类的部分属性更新)
foreach(stringkeyinformValues.Keys)
stringvalue=formValues[key];
System.Reflection.PropertyInfopropertyInfo=obj.GetType().GetProperty(key);
if(propertyInfo!
try
//obj对象有key的属性,把对应的属性值赋值给它(从字符串转换为合适的类型)
//如果转换失败,会抛出InvalidCastException异常
propertyInfo.SetValue(obj,Convert.ChangeType(value,propertyInfo.PropertyType),null);
catch{}
}boolresult=baseBLL.Update(obj,id);
3、界面元素权限控制
我们从上面那个Web开发框架的主界面图可
以看到,里面对于某个特定的业务,增加、修改、、查看、删除等操作都放在了EasyUI的DataGrid工具栏里面了,为了动态控制用户能访问的界面按
钮,我们需要结合用户权限集合进行界面呈现,首先我们把ToolBar放到一个层里面进行定义,如下代码所示。
//实现对DataGird控件的绑定操作
functionInitGrid(queryData){
$('
#grid'
).datagrid({//定位到Table标签,Table标签的ID是grid
/Information/FindWithPager'
//指向后台的Action来获取当前用户的信息的Json格式的数据
title:
通知公告'
iconCls:
icon-view'
height:
650,
width:
function(){returndocument.body.clientWidth*0.9},//自动宽度
nowrap:
autoRowHeight:
striped:
collapsible:
pagination:
pageSize:
50,
pageList:
[50,100,200],
rownumbers:
//sortName:
ID'
//根据某个字段给easyUI排序
sortOrder:
asc'
remoteSort:
idField:
queryParams:
queryData,//异步查询的参数
columns:
[[
{field:
ck'
checkbox:
true},//选择
{title:
标题'
field:
Title'
width:
350,sortable:
true},
编辑者'
Editor'
80,sortable:
编辑时间'
EditTime'
150,sortable:
附件'
Attachment_GUID'
250,sortable:
true}
]],
toolbar:
"
#gridtoolbar"
然后在HTML里面添加gridtoolbar的层定义,作为easyUI的表格控件的工具条。
由于使用了HTML辅助类来实现界面控件代码控制生
成,因此已经可以达到了界面权限的控制了。
使用这种HTML层定义的工具条定义方式,比通过脚本定义的工具条效果少了一个分隔线,其他的都还是一致的。
&
divid="
gridtoolbar"
style
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于MVC4 EasyUI的Web开发框架形成之旅权限控制 基于 MVC4 EasyUI Web 开发 框架 形成 权限 控制