一個基於Asp.Net MVC的許可權方案

來源:互聯網
上載者:User

1.資料結構

Mad_Popedom為許可權表,Control記錄控制器名,Action記錄動作名。
Mad_Role為角色表。

2.許可權控制的實現
此處使用比較簡單AOP方式,用MVC的Filter實現,代碼如下

複製代碼 代碼如下:using System.Collections.Generic;
using System.Web.Mvc;
using Madnet.Model.MadAdmin;
using Madnet.BLL.MadAdmin;

namespace Madnet.Controllers.MadAdmin
{
public class SupportFilterAttribute : ActionFilterAttribute
{
private bool _IsLogin = true;
/// <summary>
/// 是否需要登入
/// </summary>
public bool IsLogin
{
set
{
_IsLogin = value;
}
get
{
if (System.Configuration.ConfigurationManager.AppSettings["IsLogin"] != null)
{
bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["IsLogin"].ToString(), out _IsLogin);
}
return _IsLogin;
}
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];

if (IsLogin && filterContext.HttpContext.Session["Login_User"] == null)
{
filterContext.HttpContext.Response.Redirect(new UrlHelper(filterContext.RequestContext).Action("Login", "Default"));
filterContext.Result = new EmptyResult();
}
else if (IsLogin && filterContext.HttpContext.Session["Login_User"] != null)
{
Mad_User user = filterContext.HttpContext.Session["Login_User"] as Mad_User;
if (!user.is_super)
{
if (!GetPopedom(user).Exists(p => p.Controller_Name == controllerName.ToLower() && p.Action_Name == actionName.ToLower()))
{
filterContext.HttpContext.Response.Write("沒有許可權");
filterContext.Result = new EmptyResult();
}

}
}

}
/// <summary>
/// 擷取目前使用者所有有許可權執行的動作
/// </summary>
/// <returns></returns>
public List<Atmodel> GetPopedom(Mad_User user)
{
List<Atmodel> ats = new List<Atmodel>();
List<Mad_Popedom> pops = Mad_PopedomBLL.GetPopedombyUser(user.user_id);
foreach (Mad_Popedom pop in pops)
{
ats.Add(new AtModel() { Controller_Name = pop.Control, Action_Name = pop.Action });
}
return ats;
}

}
}

解釋一下,上面的代碼就是在執行前,先擷取登入使用者可以啟動並執行Controller-Action,然後和當前需要執行的Controller-Action比較,如存在,即通過,否則為沒有許可權執行。

3.為動作添加許可權
為簡單起見,對於Controller層我是獨立出來一個類庫的,好處是等會為角色添加許可權的時候我們不需要手動輸入,只要反射dll就可以了。

,凡需要許可權控制的函數,只需要添加[SupportFilter]特性就可以了,當然這種方式只能控制到Action級。

4.為角色額添加許可權
這個比較簡單,只需要把角色和許可權關聯起來就可以了,這裡我是用反射Controller層dll實現。
Web.config

Global.asax.cs

Madnet.Controllers.Test即為Controller層的dll

Test為Controller名,index為Action名,選擇role2可以訪問的Action,提交到資料庫即可。此圖表示role2擁有Test1Controller的存取權限,但是沒有Test2Controller,Test3Controller的存取權限。

5.結束
上面4步即已完成基本的許可權控制。可以在此基礎上加上使用者組,使用者,菜單等管理,可實現”使用者-角色-許可權”的自由組合,一個簡單的通用後台大概就是這樣了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.