权限管理页面控制

我们知道对于权限管理这块,采取的思想就是RBAC

 每个用户对应一个角色,我们只需要对这个角色进行分配相应的权限即可,也就是给这个用户分配了权限,这样管理起来很方便,设计也很简答,大概就是用户表,角色表,模块表,在加上一个角色与模块对应的表就可以了,然后根据不同的用户权限,显示相应的模块或者提示没有权限访问,这里要说的就是,对每个页面的访问权限,如果都写的话,这么多的页面是个很大的工作量,类似判断用户是否登录一样,在asp.net中我们完全可以使用Forms验证来代替使用session每个页面都要判断的做法,同样,在这里我们也可以通过HttpModule来直接过滤掉没有访问权限的页面,方便多了,我们知道HttpModule可以再服务器端接收处理之前进行相关的过滤,这点给我们提供很大的方便,我们完全可以利用它的这一点,具体的来看看下:

ExpandedBlockStart.gif View Code
   public  class CheckUserModule : IHttpModule
    {

         private  static  string loginPage =  " login.aspx ";
         #region IHttpModule Members
         public  void Dispose()
        {
             // 此处放置清除代码。
        }

         public  void Init(HttpApplication context)
        {                   
            context.AcquireRequestState +=  new EventHandler(checkUserRight);           
        }
        
         ///   <summary>
        
///  检测用户权限
        
///   </summary>
         void checkUserRight( object sender, EventArgs e)
        {             
            HttpApplication application = (HttpApplication)sender;           //  获取应用程序            
             string url =  HttpContext.Current.Request.Url.ToString();        //  获取Url
             int start=url.LastIndexOf( ' / ') +  1;                              // 查找URL中最后一个/的位置
             int end=url.IndexOf( ' ? ',start);                                  // 查找URL中?位置
             string requestPage =  null;                                      
             if (end <  0) end = url.Length -  1;
            requestPage=url.Substring(start, end - start + 1);                // 得到所请求的页面
            requestPage = requestPage.ToLower();
             if (requestPage == loginPage)  return;
             if (!isProtectedResource(requestPage))  return;
            User user=SJL.Web.HttpCode.WebUtility.currentUser;               // 获得当前用户          
             if (user== null)
            {
                application.Response.Redirect( " ~/Login.aspx ");
                 return;
            }                
             if (SJL.Bll.UserRight.UserBLL.isAdmin(user))  return;                     
             // 检测用户权限
             if (!SJL.Bll.UserRight.RoleRightBLL.canAccessPage(user.RoleID, requestPage))                
                application.Response.Redirect( " ~/AccessDeny.htm ");
        }

         ///   <summary>
        
///  判断页面是否为受权限管理保护的资源(如Aspx等)
        
///   </summary>
        
///   <param name="page"> 所请求的页面 </param>
        
///   <returns> 是否受保护 </returns>
         bool isProtectedResource( string page)
        {
            page = page.ToLower();
            System.Collections.Generic.List<String> protectedFiles = 
             new System.Collections.Generic.List< string>();             // 受保护资源的扩展名          
            protectedFiles.AddRange( new  string[] {  " .aspx "" .asmx "" .ashx " });
             string found=protectedFiles.Find(s => page.EndsWith(s));
             if (found ==  null)
                 return  false;            
            ApplicationModule module = SJL.Bll.UserRight.ApplicationModuleBLL.getByUrl(page);
             if (module ==  nullreturn  false;
             return !module.IsPublic;                                         // 如果页面为公共模块则不受保护            
        }     
         #endregion

         public  void OnLogRequest(Object source, EventArgs e)
        {
             // 可以在此放置自定义日志记录逻辑
        }       
 
         
    }

Web.coinfig中配置下

 <httpModules>

        <add name="CheckUserModule" type="SJL.Web.HttpCode.CheckUserModule"/>

      </httpModules>

 

先判断是否登录,是否是受保护的资源,然后根据url来判断是否有权限访问!

我们可以根据自己需要控制的权限去设置,比如一个企业级的软件,我们需要控制菜单的页面,那么这个时候,我们只需要判断
  1、.aspx结尾的文件,httpModules过滤的时候也会过滤下比如css,js,ashx等页面,在这里因为受权限保护的只有aspx结尾的,所有只需要对aspx结尾的进行过滤判断即可
  2、是否是受权限控制的页面
  3、如果没有登录,则跳到登录页面

  4、如果是受权限控制的页面,那么就看看此时登录的用户是否有访问的这个页面的url权限即可

注意点:

  1、因为这种方式主要是对页面进行权限判断,所以为了权限设置到位,比较严,最好每一个需要权限保护的功能都单独做一个页面,不要和其他页面套在一起,放置权限设置混乱

  2、判断权限页面的时候,对访问的页面和数据库保存的页面都要去除参数和目录,比如/user/user_edit.aspx?id=5,那么这个时候我们就要截取获得user_edit.aspx用来判断,否则,就会出现权限控制不严格的情况,比如列表 /user/user_list.aspx,如果你对访问过来的url没有截取判断,那么访问user_list.aspx?page=5则会通过,但是事实上我们已经控制这个页面不让访问了,就是因为url不同导致权限控制有问题,所以这点一定要注意!
 采用httpModule的好处就是一步操作就可以完成权限控制和未登录验证,效果很好,改变了传统的每个页面都需要判断的写法
Code:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using shuang.Model;
///   <summary>
/// CheckUserModule 的摘要说明
///   </summary>
public  class CheckRoleModule : IHttpModule
{

     public  static  string loginPage =  " login.aspx ";
     public CheckRoleModule()
    {
         //
        
// TODO: 在此处添加构造函数逻辑
        
//
    }
     #region IHttpModule 成员
     public  void Init(HttpApplication context)
    {
        context.AcquireRequestState +=  new EventHandler(checkUserMenu);
    }

     void checkUserMenu( object sender, EventArgs e)
    {
       
        HttpApplication application = (HttpApplication)sender;           //  获取应用程序            
         string url = HttpContext.Current.Request.Url.ToString();        //  获取Url
         int start = url.LastIndexOf( ' / ') +  1;                              // 查找URL中最后一个/的位置
         int end = url.IndexOf( ' ? ', start);                                  // 查找URL中?位置
         string requestPage =  null;
         if (end <  0) end = url.Length;
        requestPage = url.Substring(start, end - start);                // 得到所请求的页面
        
// 截取后缀
         if (requestPage == loginPage)  return;
         string requestPageSuffix = requestPage.Substring(requestPage.LastIndexOf( " . ") +  1);
         if (requestPageSuffix !=  " aspx ")
        {
             return;
        }
         string user = OperateCommon.currentUser;//对每一个页面都要判断是否登录
         if (user ==  null)
        {
            application.Response.Write( " <script language='javascript'>parent.location.href=' " + Common.ApplicationRootPath +  " /login.aspx';</script> ");
             return;
        }
         else
        {
           
           
             // 查看是否是菜单权限控制页面
            
//   requestPage = url.Substring(start);
             if (!isProtectedResource(requestPage))  return;
             // 检测用户权限
             if (!OperateCommon.isPross(user,requestPage)) {
                Common.showMsg( " 0 "" 你没有访问该页面的权限,请联系管理员 ");
            }
        }
    
        
    }
     ///   <summary>
    
///  判断页面是否为受权限管理保护的资源
    
///   </summary>
    
///   <param name="page"> 所请求的页面 </param>
    
///   <returns> 是否受保护 </returns>
     bool isProtectedResource( string page)
    {
        //  page = page.ToLower();
        List<String> protectedFiles =OperateCommon.GetMenu(); // 受保护的页面
        
// 读取所有菜单栏目的url
         bool fig =  false;
         foreach ( string item  in protectedFiles)
        {
             if(item==page)
            {
                fig =  true;
                 break;
            }
        }
         return fig;
    }


     public  void Dispose()
    {
        //  throw new NotImplementedException();
    }
     #endregion
}

OPerateCommon

 

ExpandedBlockStart.gif View Code
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using shuang.BLL;
using shuang.Model;
using System.Collections.Generic;
///   <summary>
/// OperateCommon 的摘要说明
///   </summary>
public  class OperateCommon
{
     public OperateCommon()
    {
         //
        
// TODO: 在此处添加构造函数逻辑
        
//
    }
     private  const  string SessionUser =  " LoginName ";    // 登录用户   
     private  static  string loginName =  "";
     public  static  string currentUser
    {
         get
        {
             if (HttpContext.Current ==  null)
            {
                 return  null;
            }
             else
            {
                 if (HttpContext.Current.Session[SessionUser] !=  null)
                {
                     return HttpContext.Current.Session[SessionUser].ToString();
                }
            }
             return  null;
           
        }
         set
        {
            HttpContext.Current.Session[SessionUser] = value;
        }
    }
     public  static  void getLoginName()
    {
         if (currentUser!=  null)
        {
            loginName = HttpContext.Current.Session[SessionUser].ToString();
        }
         else
        {
            HttpContext.Current.Response.Redirect( " ~/logout.aspx ");
        }
    }
     ///   <summary>
    
///  检测用户的访问权限
    
///   </summary>
    
///   <returns></returns>
     public  static  bool isPross( string loginName, string requestPage)
    {
        UserBLL bll =  new UserBLL();
        RoleBLL rolebll =  new RoleBLL();
        menuBLL menubll =  new menuBLL();
         bool fig =  false;
        DataSet ds = bll.GetList( "  userName=' "+loginName+ " ' ");
         if (ds !=  null)
        {
             string roleId = ds.Tables[ 0].Rows[ 0][ " userRole "].ToString();
            Role role = rolebll.GetModel(Convert.ToInt32(roleId));
             string menuId = role.roleMenulimit;
        
            DataSet dsMenu = menubll.GetList( "  menuId in( "+menuId+ " ) ");
             foreach (DataRow row  in dsMenu.Tables[ 0].Rows)
            {
                 string url = row[ " url "].ToString();
                 int start = url.LastIndexOf( ' / ') +  1;                              // 查找URL中最后一个/的位置
                 int end = url.IndexOf( ' ? ', start);
                 string url1 =  null;
                 if (end <  0) end = url.Length;
                url1 = url.Substring(start, end - start);
                 if (url1 == requestPage)
                {
                    fig= true;
                     break;
                }
            }
        }

         return fig;
    }
     ///   <summary>
    
///  获取受保护的菜单页面
    
///   </summary>
    
///   <returns></returns>
     public  static List< string> GetMenu()
    { 
         menuBLL menubll =  new menuBLL();
         DataSet ds = menubll.GetList( "  parent!=0 ");
         List< string> menuList =  new List< string>();
          foreach (DataRow row  in ds.Tables[ 0].Rows)
         {
               string url = row[ " url "].ToString();
               int start = url.LastIndexOf( ' / ') +  1; // 查找URL中最后一个/的位置
            
//   url = url.Substring(start);
               int end = url.IndexOf( ' ? ', start);  
               string requestPage =  null;
               if (end <  0) end = url.Length;
                 requestPage = url.Substring(start, end - start);
                 menuList.Add(requestPage);
         }
          return menuList;
    }
}

 

web.config

<add name="CheckUserModule" type="CheckRoleModule"/>

这样就完成了权限限制,文件过滤等问题...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值