丁允超 范小花
(1. 重慶工程學(xué)院軟件與計(jì)算機(jī)學(xué)院, 重慶 400056; 2. 重慶科技學(xué)院安全工程學(xué)院, 重慶 401331)
?
基于MVC4.0的用戶登錄模塊設(shè)計(jì)與實(shí)現(xiàn)
丁允超1范小花2
(1. 重慶工程學(xué)院軟件與計(jì)算機(jī)學(xué)院, 重慶 400056; 2. 重慶科技學(xué)院安全工程學(xué)院, 重慶 401331)
為了保障信息系統(tǒng)的數(shù)據(jù)安全,系統(tǒng)必須具備用戶登錄時(shí)的身份驗(yàn)證功能。針對(duì)某信息系統(tǒng),介紹系統(tǒng)用戶登錄模塊的設(shè)計(jì),給出用戶登錄驗(yàn)證的參考代碼。
用戶登錄;過濾器;HQL;權(quán)限
重慶某汽車零部件有限公司大部分的業(yè)務(wù)管理工作需通過人工完成。為了節(jié)約企業(yè)運(yùn)營(yíng)成本、提升工作效率,公司提出了開發(fā)信息化管理系統(tǒng)的需求。該系統(tǒng)可實(shí)現(xiàn)用戶登錄、合同申請(qǐng)、審核管理以及財(cái)務(wù)方面借款、還款、掛賬等功能。系統(tǒng)中用戶登錄模塊采用了MVC4.0技術(shù),用戶過濾采用了MVC過濾器與控制器相結(jié)合的方式來實(shí)現(xiàn)。在此,闡述用戶登錄模塊的具體實(shí)現(xiàn)方法。
登錄模塊是系統(tǒng)的入口。為了驗(yàn)證用戶的合法身份,系統(tǒng)要求用戶輸入用戶名和密碼來進(jìn)行有效性驗(yàn)證。如果未通過驗(yàn)證,系統(tǒng)會(huì)提示或指導(dǎo)用戶正確輸入;如果通過驗(yàn)證,則允許用戶進(jìn)入系統(tǒng)權(quán)限的驗(yàn)證,根據(jù)當(dāng)前登錄用戶的角色及權(quán)限顯示相應(yīng)的權(quán)限菜單[1]。圖1所示為用戶登錄流程圖。
2.1 過濾器實(shí)現(xiàn)未登錄攔截
MVC中的過濾器分4種,分別為IActionFilter(動(dòng)作過濾器)、 IAuthorizationFilter(授權(quán)過濾器)、IExceptionFilter(異常過濾器)、IResultFilter(結(jié)果過濾器)[2]。在此,應(yīng)用MVC的動(dòng)作過濾器實(shí)現(xiàn)用戶登錄模塊中的過濾功能。
為了實(shí)現(xiàn)未登錄用戶過濾及成功登錄權(quán)限判定,需要重寫控制器的OnActionExecuting方法。
圖1 用戶登錄流程圖
自定義一個(gè)控制器,命名為UcController,具體代碼如下。
public class UcController : Controller
{
∥重寫OnActionExecuting方法,這個(gè)方法在Action執(zhí)行時(shí)執(zhí)行
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
return;
∥獲取控制器名稱
string controllerName = filterContext.Controller.ToString();
∥獲取Action的名稱
string actionName = filterContext.ActionDescriptor.ActionName;
∥如果是用戶請(qǐng)求登錄頁(yè)面則不驗(yàn)證權(quán)限
if (controllerName.Equals("UserController") && (actionName == "Login"))
{
∥執(zhí)行mvc默認(rèn)的行為
base.OnActionExecuting(filterContext);
}
else
{
∥如果登錄信息丟失
if (AppHelper.LoginedUser == null)
{
Redirect(filterContext);∥跳轉(zhuǎn)到登錄頁(yè)面
Response.End();∥結(jié)束響應(yīng)
}
else
{
∥判斷登錄用戶是否有權(quán)限訪問當(dāng)前頁(yè)面,如果沒有訪問權(quán)限
if (!IsAuthenticated(controllerName, actionName))
{
}
else
{
base.OnActionExecuting(filterContext);
}
}
}
}
}
實(shí)現(xiàn)了此項(xiàng)功能后,項(xiàng)目中所有的控制器均繼承自UcController控制器。只需要在UcController中對(duì)用戶進(jìn)行驗(yàn)證即可,所有請(qǐng)求均會(huì)先執(zhí)行UcController控制,代碼得以復(fù)用。這樣,減少了重復(fù)驗(yàn)證的工作量,使程序更加簡(jiǎn)化[3]。
2.2 使用HQL語言實(shí)現(xiàn)用戶和密碼的驗(yàn)證
HQL(hibernate query language)提供了更加豐富靈活、更為強(qiáng)大的查詢能力。 HQL更接近SQL語句查詢語法,因?yàn)镃astle繼承自Hibernate,對(duì)Hibernate進(jìn)一步封裝,所以在Castle框架下可以使用HQL語言進(jìn)行查詢。
Using NHibernate;
public Users Login(string account, string password)
{
StringBuilder sql = new StringBuilder("from Users where Account=? and Password=?");
∥獲取管理T的session對(duì)象
ISession session = ActiveRecordBase.holder.CreateSession(typeof(Users));
IQuery query = session.CreateQuery(sql.ToString());
query.SetString(0, account);
query.SetString(1, password);
IList
if(arr==null||arr.Count==0)
{
return null;
}else
{
return arr[0];
}
}
2.3 根據(jù)用戶角色獲取權(quán)限
驗(yàn)證用戶的賬號(hào)和密碼后,還需驗(yàn)證當(dāng)前登錄用戶的權(quán)限。若用戶和角色的關(guān)系為多對(duì)多映射,則一個(gè)用戶可以擁有多個(gè)角色,用戶的角色權(quán)限就有可能重復(fù)[4]。為了保證界面顯示不出問題,需要去掉用戶的重復(fù)權(quán)限。通過下面的代碼可獲取當(dāng)前用戶所有權(quán)限菜單。
public static IList
{
get
{
∥獲取系統(tǒng)中所有的功能模塊
privileges = Container.Instance.Resolve
∥return privileges;
if (privileges == null)
{
return privileges;
}
∥聲明一個(gè)集合變量
IList
∥如果有用戶登錄并且有對(duì)應(yīng)的角色
if (LoginedUser != null && LoginedUser.Roles != null)
{
foreach (Role role in LoginedUser.Roles)∥遍歷當(dāng)前用戶的角色
{
if (role != null)
{
∥獲取當(dāng)前用戶可以操作的功能
foreach (SystemFunction function in role.SystemFunctions)
{
if (privilegeList == null)
{
∥實(shí)例化權(quán)限集合
privilegeList = new List
}
∥如果當(dāng)前功能在權(quán)限集合中不存在
if (privilegeList.Where(o => o.ID == function.ID).Count() < 1)
{
privilegeList.Add(function);∥添加到集合中
}
}
}
}
}
return privilegeList;
}
}
針對(duì)某公司的信息管理系統(tǒng),設(shè)計(jì)登錄模塊的用戶權(quán)限驗(yàn)證功能。用MVC的過濾器技術(shù),結(jié)合Castle的HQL技術(shù)實(shí)現(xiàn)用戶的過濾和驗(yàn)證。所有代碼均在Win7、Visual Studio2013、MySql 5.0環(huán)境中調(diào)試通過。本次設(shè)計(jì)基本上實(shí)現(xiàn)了登錄權(quán)限管理功能,可以應(yīng)用于系統(tǒng)中,部分細(xì)節(jié)問題仍需在實(shí)踐中進(jìn)一步完善。
[1] 郭昊.基于ASP.NET MVC3和jQuery的網(wǎng)站應(yīng)用開發(fā)[D].武漢:華中師范大學(xué),2013:14.
[2] 陳剛.一種截取過濾器實(shí)現(xiàn)方案的應(yīng)用研究[J].微型機(jī)與應(yīng)用,2012(19):6-7.
[3] 吳兆立.基于ASP技術(shù)的學(xué)生信息管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008(9):165-169.
[4] 劉亞鵬,張征,俞婷.基于MVC多層架構(gòu)的Web應(yīng)用框架設(shè)計(jì)[J].微計(jì)算機(jī)信息,2011(7):170.
[5] 丁允超,范小花.SQL注入攻擊原理及其防范措施[J].重慶科技學(xué)院學(xué)報(bào)(自然科學(xué)版),2012,14(5):136-139.
Design and Implementation of User Login Module Based on MVC4.0
DINGYunchao1FANXiaohua2
(1.Chongqing Institute of Engineering, Chongqing 400056, China; 2.School of Safety Engineering, Chongqing University of Science and Technology, Chongqing 401331, China)
In order to ensure the data security of the system, a system must verify the identity of the user. This article focuses on the research of the user login module, and proposes the user login validation of the reference code based on an actual information system.
login; filter; HQL; privilege
2016-11-23
國(guó)家自然科學(xué)基金項(xiàng)目“多因素耦合作用下尾礦庫(kù)(壩)潰決礦漿運(yùn)動(dòng)機(jī)制及其預(yù)測(cè)模型研究”( 51404049) ; 重慶市基礎(chǔ)與前沿研究計(jì)劃項(xiàng)目“硫鐵礦采冶廢渣場(chǎng)中重金屬環(huán)境污染過程及污染釋放機(jī)理研究”(CSTC2016JCYJA0319) ; 重慶市教委科學(xué)技術(shù)研究項(xiàng)目“排土場(chǎng)泥石流災(zāi)害預(yù)警與評(píng)估模型研究”( KJ1501328)
丁允超(1980 — ),男,碩士,講師,研究方向?yàn)檐浖夹g(shù)、數(shù)據(jù)庫(kù)技術(shù)、信息安全。
TP319
A
1673-1980(2017)02-0106-03