C#使用者權限控制架構,可以控制到類【重發】

來源:互聯網
上載者:User

這篇文章是在我的“園齡”不到三天的時候寫的,原文地址是:http://www.cnblogs.com/fantong/archive/2012/09/14/2684856.html

我昨天發的文章 《vs2012遠端偵錯功能的改進》 閱讀次數超過兩千,而此文才五百多,應該是寫這篇文章的時候還不能發布到部落格園首頁的原因。

我覺得這篇文章要比昨天的《vs2012遠端偵錯功能的改進》更有價值,所以今天重發一次,希望更多的朋友能夠看到。

《vs2012遠端偵錯功能的改進》寫的只是一個簡單應用,而此文講的是一種許可權控制的思想。

==========================================================================================

我曾經在想,怎麼樣控制許可權比較好呢。曾經嘗試過控制到頁面,很方便,但不細緻;也曾想過控制到按鈕,很麻煩,也不靈活。最終我決定,還是控制到方法吧(實際是控制到類),所以現在這套許可權管理方案便產生了。只需要繼承與一個類,並給它設定一個attribute,就那麼簡單。這就是Lm.Common.Auth命名空間提供的許可權控制方案。

以下是對這種許可權控制方案的簡單描述,以及整理出來的最簡代碼。

完整代碼請訪問我的開源項目,http://lmcommon.codeplex.com/

OperationBase類,是許可權控制的核心。如果一個類ClassA繼承與OperationBase,那麼ClassA提供的所有方法,都將受到OperationBase的許可權控制。

所謂許可權控制的核心,就是判斷一個使用者標識和一個許可權標識之間的對應關係。

OperationBase類對其子類的以下兩個要求,使得OperationBase類收集到這個兩個標識。

1、OperationBase類要求其子類必須向其建構函式提供一個使用者標識;

2、OperationBase類要求其子類必須有一個OperationAttribute特性,並在OperationAttribute中提供許可權標識。

許可權控制執行過程(子類以CreateOrder【建立訂單類】為例):

1、向CreateOrder類的建構函式傳遞一個使用者標識,以便構造一個CreateOrder類的執行個體;

2、由於CreateOrder繼承與OperationBase,OperationBase的建構函式必然會被調用;

3、在OperationBase的建構函式中,檢查CreateOrder是否具有OperationAttribute特性,如果,提取出其中的許可權標識,如果沒有,拋出異常,終止構造過程;

4、收集到使用者標識和許可權標識後,去資料庫中比對,如果此使用者,沒有許可權,拋出異常,終止構造過程;

5、CreateOrder的執行個體無法構造,其提供的方法,自然無法執行,以達到許可權控制的目的。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Lm.Common.Auth{    /// <summary>    /// 許可權控制的核心類    /// </summary>    public abstract class OperationBase    {        /// <summary>                /// </summary>        /// <param name="user">使用者編號</param>        protected OperationBase(string user)        {            //擷取子類的許可權編號            var attrList = this.GetType().GetCustomAttributes(typeof(OperationAttribute), false);            if (attrList.Length != 1)            { throw new Exception("當前類" + this.GetType().FullName + "沒有OperationAttribute特性"); }            var attr = (OperationAttribute)attrList.Single();            var operationCode = attr.OperationCode;            //拿到了許可權編號,和參數中的使用者編號,            //就可以去資料庫中比較,看看該使用者是不是具有這個許可權,            //如果沒有許可權,拋出異常,中斷許可權實際操作類的構造        }    }    /// <summary>    /// 這個類用來儲存許可權編號    /// </summary>    public sealed class OperationAttribute : Attribute    {        public string OperationCode { get; set; }        private OperationAttribute()        { }        public OperationAttribute(string operationCode)        {            this.OperationCode = operationCode;        }    }    /// <summary>    /// 這個類提供建立訂單的功能,這個類的許可權編號是“CreateOrder”    /// </summary>    [Operation("CreateOrder")]    public class CreateOrder : OperationBase    {        public CreateOrder(string user)            : base(user)        { }        public void Work1()        {            //完成某些功能        }        public void Work2()        {            //完成某些功能        }    }}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.