1. 程式人生 > >【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(6) 控制器基類 主要做登入使用者、許可權認證、日誌記錄等工作

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做專案(6) 控制器基類 主要做登入使用者、許可權認證、日誌記錄等工作

索引

簡述

今天我們來寫一個控制器基類 主要做登入使用者、許可權認證、日誌記錄等工作

專案準備

我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。

專案開始

很多朋友在前幾篇都遇到 根節點 的問題,我把這幾個xml先給大家貼一下

WebPage/Config下面三個XML

ComControllers.xml、IndexControllers.xml

1 <?xml version="
1.0" encoding="utf-8" ?> 2 <objects xmlns="http://www.springframework.net"> 3 <description>Spring注入控制器,容器指向Service層封裝的介面</description> 4 </objects>
View Code

Controllers.xml

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <objects xmlns="http://www.springframework.net
"> 3 <description>Spring注入控制器,容器指向Service層封裝的介面</description> 4 <!--系統管理 Begin--> 5 <!--登入控制器--> 6 <object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false"> 7 <property name="UserManage" ref="Service.User"
/> 8 </object> 9 <!--系統管理 end--> 10 </objects>
View Code

Service/Config下面兩個XML

ComService.xml

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3   <description>Spring注入Service,容器指向本層層封裝的介面,捨棄Dao層,減少程式碼量</description>
4 </objects>
View Code

Service.xml

1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3   <description>Spring注入Service,容器指向本層層封裝的介面,捨棄Dao層,減少程式碼量</description>
4   <!--系統管理begin-->
5   <!--使用者管理-->
6   <object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false">
7   </object>
8   <!--系統管理end-->
9 </objects>
View Code

一、我們在Controllers資料夾下新建一個控制器 BaseController, 用於控制器基類,主要做登入使用者、許可權認證、日誌記錄等工作

二、我們宣告一些公共變數和容器

變數主要用於我們查詢分頁的時候使用者傳遞關鍵字、頁碼和分頁條數

這個使用者容器 主要是使用者後臺使用者的一些操作

 1  #region 公用變數
 2         /// <summary>
 3         /// 查詢關鍵詞
 4         /// </summary>
 5         public string keywords { get; set; }
 6         /// <summary>
 7         /// 檢視傳遞的分頁頁碼
 8         /// </summary>
 9         public int page { get; set; }
10         /// <summary>
11         /// 檢視傳遞的分頁條數
12         /// </summary>
13         public int pagesize { get; set; }
14         /// <summary>
15         /// 使用者容器,公用
16         /// </summary>
17         public IUserManage UserManage = Spring.Context.Support.ContextRegistry.GetContext().GetObject("Service.User") as IUserManage;
18  #endregion

三、獲取當前使用者物件

從Sesssion中獲取使用者物件,Session過期後 通過 Cookies重新獲取使用者物件

 1         #region 使用者物件
 2         /// <summary>
 3         /// 獲取當前使用者物件
 4         /// </summary>
 5         public Account CurrentUser
 6         {
 7             get
 8             {
 9                 //從Session中獲取使用者物件
10                 if (SessionHelper.GetSession("CurrentUser") != null)
11                 {
12                     return SessionHelper.GetSession("CurrentUser") as Account;
13                 }
14                 //Session過期 通過Cookies中的資訊 重新獲取使用者物件 並存儲於Session中
15                 var account = UserManage.GetAccountByCookie();
16                 SessionHelper.SetSession("CurrentUser", account);
17                 return account;
18             }
19         }
20         #endregion

四、重寫控制器 OnActionExecuting(ActionExecutingContext filterContext)方法 實現登入驗證和公共變數的獲取

 protected override void OnActionExecuting(ActionExecutingContext filterContext)

 1  #region 登入使用者驗證
 2             //1、判斷Session物件是否存在
 3             if (filterContext.HttpContext.Session == null)
 4             {
 5                 filterContext.HttpContext.Response.Write(
 6                        " <script type='text/javascript'> alert('~登入已過期,請重新登入');window.top.location='/'; </script>");
 7                 filterContext.RequestContext.HttpContext.Response.End();
 8                 filterContext.Result = new EmptyResult();
 9                 return;
10             }
11             //2、登入驗證
12             if (this.CurrentUser == null)
13             {
14                 filterContext.HttpContext.Response.Write(
15                     " <script type='text/javascript'> alert('登入已過期,請重新登入'); window.top.location='/';</script>");
16                 filterContext.RequestContext.HttpContext.Response.End();
17                 filterContext.Result = new EmptyResult();
18                 return;
19             }
20 
21 #endregion
 1  #region 公共Get變數
 2             //分頁頁碼
 3             object p = filterContext.HttpContext.Request["page"];
 4             if (p == null || p.ToString() == "") { page = 1; } else { page = int.Parse(p.ToString()); }
 5 
 6             //搜尋關鍵詞
 7             string search = filterContext.HttpContext.Request.QueryString["Search"];
 8             if (!string.IsNullOrEmpty(search)) { keywords = search; }
 9             //顯示分頁條數
10             string size = filterContext.HttpContext.Request.QueryString["example_length"];
11             if (!string.IsNullOrEmpty(size) && System.Text.RegularExpressions.Regex.IsMatch(size.ToString(), @"^\d+$")) { pagesize = int.Parse(size.ToString()); } else { pagesize = 10; }
12 #endregion

五、模組許可權驗證功能

規則:1、根據模組別名驗證對應模組
        2、根據模組操作Action 驗證是否可操作按鈕

這裡我們分為兩個打步驟:第一,前臺按鈕沒有相應操作許可權的,我們移除前臺操作按鈕。

                                  第二,也是為了防止使用者繞過前臺驗證,我們對後臺模組以及方法進行驗證,如果使用者對相應的模組沒有相應的操作許可權(新增、修改、刪除、稽核、釋出等等,包含自定義操作型別),我們拒絕執行。

網站的許可權判斷是一個非常普遍的需求,我們實現這樣的需求只要從 AuthorizeAttribute 整合,重寫相關的判斷邏輯

我們新建一個許可權驗證類UserAuthorizeAttribute 繼承 AuthorizeAttribute (關於AuthorizeAttribute 點選這裡

public class UserAuthorizeAttribute : AuthorizeAttribute

我們對新增一個自定義的Attribute,通過AttributeUsage的Attribute來限定Attribute 所施加的元素的型別

作為引數的AttributeTarges的值允許通過“或”操作來進行多個值得組合,如果你沒有指定引數,那麼預設引數就是All 。

AttributeUsage除了繼承Attribute 的方法和屬性之外,還定義了以下三個屬性:

AllowMultiple: 讀取或者設定這個屬性,表示是否可以對一個程式元素施加多個Attribute 。

Inherited:讀取或者設定這個屬性,表示是否施加的Attribute 可以被派生類繼承或者過載。

ValidOn: 讀取或者設定這個屬性,指明Attribute 可以被施加的元素的型別。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class UserAuthorizeAttribute : AuthorizeAttribute
{
}

新增一些欄位和屬性,並且例項化基類

 1  #region 欄位和屬性
 2         /// <summary>
 3         /// 模組別名,可配置更改
 4         /// </summary>
 5         public string ModuleAlias { get; set; }
 6         /// <summary>
 7         /// 許可權動作
 8         /// </summary>
 9         public string OperaAction { get; set; }
10         /// <summary>
11         /// 許可權訪問控制器引數
12         /// </summary>
13         private string Sign { get; set; }
14         /// <summary>
15         /// 基類例項化
16         /// </summary>
17         public BaseController baseController = new BaseController();
18 
19 #endregion

我們重寫 AuthorizeAttribute 的 OnAuthorization(AuthorizationContext filterContext)方法

1         /// <summary>
2         /// 許可權認證
3         /// </summary>
4         public override void OnAuthorization(AuthorizationContext filterContext)
5         {
6         }

分為四步:

1、判斷模組是否對應

2、判斷使用者是否存在

3、呼叫下面的方法,驗證是否有訪問此頁面的許可權,檢視加操作

4、有許可權訪問頁面,將此頁面的許可權集合傳給頁面

1             //1、判斷模組是否對應
2             if (string.IsNullOrEmpty(ModuleAlias))
3             {
4                 filterContext.HttpContext.Response.Write(" <script type='text/javascript'> alert('^您沒有訪問該頁面的許可權!'); </script>");
5                 filterContext.RequestContext.HttpContext.Response.End();
6                 filterContext.Result = new EmptyResult();
7                 return;
8             }
1             //2、判斷使用者是否存在
2             if (baseController.CurrentUser == null)
3             {
4                 filterContext.HttpContext.Response.Write(" <script type='text/javascript'> alert('^登入已過期,請重新登入!');window.top.location='/'; </script>");
5                 filterContext.RequestContext.HttpContext.Response.End();
6                 filterContext.Result = new EmptyResult();
7                 return;
8             }
 1        //對比變數,用於許可權認證
 2             var alias = ModuleAlias;
 3 
 4             #region 配置Sign調取控制器標識
 5             Sign = filterContext.RequestContext.HttpContext.Request.QueryString["sign"];
 6             if (!string.IsNullOrEmpty(Sign))
 7             {
 8                 if (("," + ModuleAlias.ToLower()).Contains("," + Sign.ToLower()))
 9                 {
10                     alias = Sign;
11                     filterContext.Controller.ViewData["Sign"] = Sign;
12                 }
13             }
14             #endregion
 1             //3、呼叫下面的方法,驗證是否有訪問此頁面的許可權,檢視加操作
 2             var moduleId = baseController.CurrentUser.Modules.Where(p => p.ALIAS.ToLower() == alias.ToLower()).Select(p => p.ID).FirstOrDefault();
 3             bool _blAllowed = this.IsAllowed(baseController.CurrentUser, moduleId, OperaAction);
 4             if (!_blAllowed)
 5             {
 6                 filterContext.HttpContext.Response.Write(" <script type='text/javascript'> alert('您沒有訪問當前頁面的許可權!');</script>");
 7                 filterContext.RequestContext.HttpContext.Response.End();
 8                 filterContext.Result = new EmptyResult();
 9                 return;
10             }
1             //4、有許可權訪問頁面,將此頁面的許可權集合傳給頁面
2             filterContext.Controller.ViewData["PermissionList"] = GetPermissByJson(baseController.CurrentUser, moduleId);

上面主要是對後臺控制器方法操作許可權的驗證,有時候前臺展示了比如 新增、刪除功能,但是使用者去操作的時候後臺驗證不通過會提示使用者沒有操作許可權,這樣顯得不是很友好,我們返回個許可權Json,前臺按鈕沒有這個許可權的我們就移除掉

1         /// <summary>
2         /// 獲取操作許可權Json字串,供檢視JS判斷使用
3         /// </summary>
4         string GetPermissByJson(Account account, int moduleId)
5         {
6             //操作許可權
7             var _varPerListThisModule = account.Permissions.Where(p => p.MODULEID == moduleId).Select(R => new { R.PERVALUE }).ToList();
8             return Common.JsonConverter.Serialize(_varPerListThisModule);
9         }
 1         /// <summary>
 2         /// 功能描述:判斷使用者是否有此模組的操作許可權
 3         /// </summary>
 4         bool IsAllowed(Account user, int moduleId, string action)
 5         {
 6             //判斷入口
 7             if (user == null || user.Id <= 0 || moduleId == 0 || string.IsNullOrEmpty(action)) return false;
 8             //驗證許可權
 9             var permission = user.Permissions.Where(p => p.MODULEID == moduleId);
10             action = action.Trim(',');
11             if (action.IndexOf(',') > 0)
12             {
13                 permission = permission.Where(p => action.ToLower().Contains(p.PERVALUE.ToLower()));
14             }
15             else
16             {
17                 permission = permission.Where(p => p.PERVALUE.ToLower() == action.ToLower());
18             }
19             return permission.Any();
20         }

模組去重

 1     /// <summary>
 2     /// 模型去重,非常重要
 3     /// add yuangang by 2016-05-25
 4     /// </summary>
 5     public class ModuleDistinct : IEqualityComparer<Domain.SYS_MODULE>
 6     {
 7         public bool Equals(Domain.SYS_MODULE x, Domain.SYS_MODULE y)
 8         {
 9             return x.ID == y.ID;
10         }
11 
12         public int GetHashCode(Domain.SYS_MODULE obj)
13         {
14             return obj.ToString().GetHashCode();
15         }
16     }

後面,我們就用到這個基類,我先給大家看一下這個許可權認證在後臺是如何使用的,加上這一句就OK了

錯誤:對不起,我犯錯誤了,好幾個專案開著,混了。大家可能都遇到了

 因為我沒有新增使用者的測試資料,所以這裡一直沒發現這個錯誤,這裡很明顯是沒有注入  在Service.xml 

相關推薦

無私分享入門精通ASP.NET MVC0開始一起框架專案6 控制器 主要登入使用者許可權認證日誌記錄工作

索引 簡述 今天我們來寫一個控制器基類 主要做登入使用者、許可權認證、日誌記錄等工作 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,

無私分享入門精通ASP.NET MVC0開始一起框架專案7.2 模組管理模組的新增修改刪除

索引 簡述 今天我們來做模組管理的 新增、修改、刪除 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了

無私分享入門精通ASP.NET MVC0開始一起框架專案5.3 登入功能的實現豐富資料表建立關聯

1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_CODE] Script Date: 2016/5/17 9:30:01 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET

無私分享入門精通ASP.NET MVC0開始一起框架專案 10部門管理崗位管理和員工管理

1 USE [wkmvc_db] 2 GO 3 /****** Object: Table [dbo].[SYS_POST_USER] Script Date: 2016/6/20 16:28:44 ******/ 4 SET ANSI_NULLS ON 5 GO

無私分享入門精通ASP.NET MVC0開始一起框架專案 12程式與資料備份

索引 簡述 程式檔案備份與資料備份 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始

無私分享入門精通ASP.NET MVC0開始一起框架專案5.4 登入功能的實現建立與登入使用者相關的介面和實現

索引 簡述 今天我們建立幾個與登入使用者相關的資料表的介面和實現類 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了

無私分享入門精通ASP.NET MVC0開始一起框架專案 14附資料庫釋出專案

索引 簡述 總結一 整個系列其實還包括專案管理、考勤簽到、郵件、內部聊天等等,這個東西是做不完的,如果繼續還有新聞系統、靜態生成等等等等.... 其中,靜態頁生成在我的部落格中可以找到,三種方式: 第一種 就是類似網上的很多CMS一樣 採用標籤替換,但這種方式是不推薦的,特別是在我們.Net中,

無私分享入門精通ASP.NET MVC0開始一起框架專案 16原始碼分享登入功能以及UI資料庫倉儲原始碼分享

1 using Common; 2 using Service.IService; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web;

無私分享入門精通ASP.NET MVC0開始一起框架專案5.5 登入功能的實現完善登入功能

索引 簡述 今天我們來完善我們的登入功能 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開

無私分享入門精通ASP.NET MVC0開始一起框架專案 登入介面前端樣式和特效

很多朋友要UI,我也說過,後臺的UI就是BootStrap,網上很多的。也有朋友喜歡LZ的登入,LZ的登入介面也是網上找的,然後稍微做了下修改。 不過既然大家喜歡,那麼LZ就分享給大家。 1、登入頁面效果 2、登入頁面程式碼 1 @{ 2 Layout = null; 3

無私分享入門精通ASP.NET MVC0開始一起框架專案5.2 登入功能的實現介面注入log4net的使用

索引 簡述 前兩天事情比較多,耽誤更新了,希望大家多多包涵,今天我們繼續做我們的登入功能 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行

無私分享入門精通ASP.NET MVC0開始一起框架專案5.1 登入功能的實現開始接觸Spring IOCDI

索引 簡述 今天我們做登入,今天的東西比較多,用到了Spring的IOC和DI、介面的使用、驗證等,希望大家多多討論 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些

無私分享入門精通ASP.NET MVC0開始一起框架專案 15原始碼分享修改倉儲IRepositoryRepositoryBase

1 #region 獲取多條資料操作 2 3 /// <summary> 4 /// 返回IQueryable集合,延時載入資料 5 /// </summary> 6 /// &l

無私分享入門精通ASP.NET MVC0開始一起框架專案7.1 模組管理驗證許可權展示模組列表

索引 簡述 今天我們來做模組管理的 展示 模組列表 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。

無私分享入門精通ASP.NET MVC0開始一起框架專案9 角色管理分配許可權

索引 簡述 今天我們來做角色的管理 和 角色許可權分配 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解

無私分享入門精通ASP.NET MVC0開始一起框架專案1搭建MVC環境 註冊區域

索引 簡述 從今天開始,我們從0開始搭建一個框架,並且完成一個任務管理系統的專案。這並不是什麼大專案,只是對於不熟悉MVC以及不熟悉面向介面開發和依賴注入的朋友們有所啟發,因為是從0開始,所以有些地方比較囉嗦,希望大家理解! 希望新手朋友們拋棄“拿來主義”,動手跟著一步一步的做,當做完這個框架和專案

無私分享入門精通ASP.NET MVC0開始一起框架專案8 許可權管理自定義許可權擴充套件許可權

索引 簡述 今天我們來做許可權的管理,這篇比較多 希望新手朋友慢慢消化 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的

無私分享入門精通ASP.NET MVC0開始一起框架專案 13客戶管理

索引 簡述 簡單的客戶管理 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。 專案開始 一、資料

無私分享入門精通ASP.NET MVC0開始一起框架專案3公共基礎資料操作 RepositoryBase

索引 簡述 今天我們寫一個基礎資料的操作類,如果裡面有大家不理解的地方,可採取兩種方式,第一:提出來,第二:會用就行。這個類呢我一般不去修改它,因為基礎操作類,大家也可以直接拷貝到自己的專案中。 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大

無私分享入門精通ASP.NET MVC0開始一起框架專案 11檔案管理

索引 簡述 檔案管理,這個比較雞肋 但是有些方法 大家可以參考下 專案準備 我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5 希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,