一個(gè)基于Asp.Net MVC的權(quán)限方案

Mad_Popedom為權(quán)限表,Control記錄控制器名,Action記錄動作名。
Mad_Role為角色表。
2.權(quán)限控制的實(shí)現(xiàn)
此處使用比較簡單AOP方式,用MVC的Filter實(shí)現(xiàn),代碼如下
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("沒有權(quán)限");
filterContext.Result = new EmptyResult();
}
}
}
}
/// <summary>
/// 獲取當(dāng)前用戶所有有權(quán)限執(zhí)行的動作
/// </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;
}
}
}
解釋一下,上面的代碼就是在執(zhí)行前,先獲取登錄用戶可以運(yùn)行的Controller-Action,然后和當(dāng)前需要執(zhí)行的Controller-Action比較,如存在,即通過,否則為沒有權(quán)限執(zhí)行。
3.為動作添加權(quán)限
為簡單起見,對于Controller層我是獨(dú)立出來一個(gè)類庫的,好處是等會為角色添加權(quán)限的時(shí)候我們不需要手動輸入,只要反射dll就可以了。
如圖所示,凡需要權(quán)限控制的函數(shù),只需要添加[SupportFilter]特性就可以了,當(dāng)然這種方式只能控制到Action級。
4.為角色額添加權(quán)限
這個(gè)比較簡單,只需要把角色和權(quán)限關(guān)聯(lián)起來就可以了,這里我是用反射Controller層dll實(shí)現(xiàn)。
Web.config
Global.asax.cs
Madnet.Controllers.Test即為Controller層的dll
Test為Controller名,index為Action名,選擇role2可以訪問的Action,提交到數(shù)據(jù)庫即可。此圖表示role2擁有Test1Controller的訪問權(quán)限,但是沒有Test2Controller,Test3Controller的訪問權(quán)限。
5.結(jié)束
上面4步即已完成基本的權(quán)限控制??梢栽诖嘶A(chǔ)上加上用戶組,用戶,菜單等管理,可實(shí)現(xiàn)”用戶-角色-權(quán)限”的自由組合,一個(gè)簡單的通用后臺大概就是這樣了。
- asp.net membership 密碼重設(shè)
- asp.net 權(quán)限管理分析
- asp.net Forms身份驗(yàn)證和基于角色的權(quán)限訪問
- 實(shí)例說明asp.net中的簡單角色權(quán)限控制
- asp.net 基于forms驗(yàn)證的目錄角色權(quán)限的實(shí)現(xiàn)
- 獲取創(chuàng)建Membership的數(shù)據(jù)庫創(chuàng)建腳本
- asp.net+sqlserver實(shí)現(xiàn)的簡單高效的權(quán)限設(shè)計(jì)示例
- asp.net BasePage類+Session通用用戶登錄權(quán)限控制
- Asp.net Mvc 身份驗(yàn)證、異常處理、權(quán)限驗(yàn)證(攔截器)實(shí)現(xiàn)代碼
- ASP.NET MVC 中實(shí)現(xiàn)基于角色的權(quán)限控制的處理方法
- ASP.NET通用權(quán)限驗(yàn)證的實(shí)現(xiàn)代碼思路
- 初識 ASP.NET Membership 用戶管理
相關(guān)文章
asp.net關(guān)于onpropertychange和oninput事件實(shí)現(xiàn)代碼
文本框,數(shù)據(jù)列表,當(dāng)在文本框中輸入條件時(shí)需要實(shí)時(shí)刷新數(shù)據(jù)列表,而且需要滿足多瀏覽器(IE6.0/7.0/8.0,FireFox,Opera,google chrome,Safair)其功能類似google的智能匹配,我是用asp.net實(shí)現(xiàn)的。2009-11-11ASP.NET Core 2.0中Razor頁面禁用防偽令牌驗(yàn)證
在這篇短文中,我將向您介紹如何ASP.NET Core2.0 Razor頁面中禁用防偽令牌驗(yàn)證,對此有興趣的朋友參考學(xué)習(xí)下吧。2018-01-01讓Silverlight 2.0動畫動起來Making Silverlight 2.0 animation Start(
Microsoft Expression Blend 2 制作動畫個(gè)人感覺倒像3DMAX 可以自動捕捉關(guān)鍵幀2008-11-11ASP.NET中用js取CheckBoxList中值的方法實(shí)例
用腳本取CheckBoxList中的值,并用"|"將其分開,之后將取到的值放入文本框,返回?cái)?shù)據(jù)庫做添加或者修改2013-07-07asp.net 類庫中使用ConfigurationManager.ConnectionStrings
類庫中使用ConfigurationManager.ConnectionStrings的步驟。2009-06-06C#中efcore-ShardingCore呈現(xiàn)“完美”分表
本文簡單的介紹了efcore的分表,著重介紹了efcore下最完美的分表組件ShardingCore,可以幫助大家更好的學(xué)習(xí),感興趣的小伙伴可以參考一下2021-08-08.Net解決引用程序集沒有強(qiáng)名稱報(bào)錯(cuò)
這篇文章介紹了.Net解決引用程序集沒有強(qiáng)名稱報(bào)錯(cuò)的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03