通用权限系统设计——第五章

这章将继续接着第四章的内容往下讲解,由于第四章,我们主要实现的是用户登录,然后得到对应的模块,没有涉及到更详细的内容。比如操作权限等等…

    第五章,我们主要讲解权限控件,权限控件也就是自定义控件。如果你不明白自定义控件的话,你可以去网上查找相关资料,我这里不做详细的讲解。

    说到自定义权限控件,我们这里将会想到权限跟模块有关,所以我们还得将第四章绑定模块的时候,稍作修改才行。那怎么选择模块的时候,我们怎么才能得到用户对此模块的有这样操作权限了,这里我想到了一个比较笨,但是比较直观的办法,也就是将每个选择模块的时候,将模块的编号传入相对应的页面(地址栏传值方式)。

比如:

现在的地址栏是:http://localhost:16521/adduser.aspx

我们修改之后变为:http://localhost:16521/adduser.aspx?moduleid=1

这样的方式,多了一个模块的编号,为了安全,我们应该对moduleid进行加密才行,但是现在我做的时候,就不加密了,甚至你还可以用一个全局变量来保存它,等等,不管什么方法,找到自己合适的方法,来记住这个“模块的编号”。

下面,我们将用户登录之后,绑定模块时,稍微修改一下,修改为:

/// <summary>
/// 绑定模块
/// </summary>
/// <paramname="roleId">角色编号</param>
private string ModuleBind(string roleId)
{
    …
    //先获取父模块
    foreach(var item inobjModuleList.FindAll(t => t.ParentID == 0))
    {
        …
        foreach(var module inobjModuleList.FindAll(t => t.ParentID == item.ModuleID))
        {
            …
       //修改的地方
       sb.AppendFormat("<a href=\"{0}?moduleid={1}\">{2}</a>",module.LinkUrl, module . ModuleID ,module.ModuleName);
       …
}

}

}

 

    这样我们就得到了模块的编号了,但是我们还得继续改进一些地方,但是这里先不做讲解,等到遇到这种情况下在做补充,这里就先卖一个关子!

 

    到现在为止,我们更改第四章的内容到此结束了,现在我们将建立一个类库,专门为自定义控件而做。我们将类库直接命名为:CustomControls

    建立完成类库之后,我们先从基本做起。

    首先我们应该得到控件所具有的权限,权限有很多中,但是在在我们数据库中分别有四种,分别是:增删改查,也是最基本的四种。

我们想到了的是怎么样让这四种特定的权限添加到我们自定义控件中了?怎么样保证我们编写的一个自定义控件就具备这四种权限了?等等…种种问题,还好程序中,有种东西叫做枚举,所以我们将用枚举来做,定义的枚举和数据库中权限是一样的,权限表中有多少操作权限,枚举中你就做多少权限。

    讲到这里,我们第三章中提到过的一个问题,就是Permissions表中的PermissionCode字段了(如果没有印象的朋友,可以去看看第三章),声明枚举的时候,我们将用到PermissionCode,声明的枚举也就是和PermissionCode字段中的值是一样的。

完整代码如下:

    

public enum PermissionEnum
{
    /// <summary>
    /// 添加
    /// </summary>
    Add, 

    /// <summary>
    /// 删除
    /// </summary>
    Delete,

    /// <summary>
    /// 编辑
    /// </summary>
    Edit, 

    /// <summary>
    /// 浏览
    /// </summary>
    Browse
}

 

 

    做到这里,是不是应该可以做权限控件了了?我们的回答是否定的。

    首先我们在想想,凭借这个枚举能做什么事情了,我认为,现在这个枚举一点用处都没有,为什么这么说,权限是跟用户有关系的,但是做到这里,我们连用户皮毛都没有看到,这个怎么能做到了?而且就算是知道了用户,但是这个按钮对应的是哪个模块下面的,你知道吗?当然,这里我们的确还不知道,所以下面我们要做的就是,要让这些不知道的变成知道的,让不可能的变成可能。

    这里还有非常重要的一点,也就是这里的权限按钮得到对应的权限,将会去和数据库进行查询,所以,这里的缓存就至关重要了,这样会使我们的按钮呈现速度大大提升。但是这里我编写的时候,尽可能使用缓存来做,如果没有用到缓存,我就会在代码里面进行提示,也是让朋友们能够很好理解,或者更好的改进这些权限控件。

 

    下一步,我们将说到这个用户对应这个模块所呈现的模块,也就是验证这个用户,在这个模块中到底权限是怎么样的,现在我们添加一个类,专门做的就是这项工作。

    说到这里,我相信大家都会有基本的概念了,也同样相信大家能够根据我上面说的做出自己的权限控件了。

    现在,我们将这些概念性的东西,变成实际可用的东西。

    由于这块用需要用客户端的一下东西和访问数据的东西,所以我们的先引用如下这几个东西:

using System.Web;
using Entity;
using Library;
using Config;

具体代码如下:

    

View Code
public class ValidataPermission
{
    /// <summary>
    /// 获取用户编号,这里直接可以从 PageBase 的获取用户编号复制代码过来
    /// </summary>
    private static int UserID
    {
        get
        {
            UserInfo objInfo = new UserInfo();
            string id = CookieHelper.GetCookie(GlobalConfig.CookieUserID);
            if(!string.IsNullOrEmpty(id))
            {
                //GetUserEntity 是具有缓存的
                objInfo = new BLL.UserBLL().GetUserEntity(Convert.ToInt32(id));
                returnobjInfo.UserID;
            }
            else
            {
                if(HttpContext.Current.Session[GlobalConfig.SessionUserInfo] != null)
                {
                    objInfo = HttpContext.Current.Session[GlobalConfig.SessionUserInfo] asUserInfo;
                    return objInfo.UserID;
                }
                else
                {
                    return 0;
                }
            }
        }
    }

    /// <summary>
    /// 角色编号,一个用户可能会是多个角色,如果是多个角色值为(1,2,3)
    /// </summary>
    private static string RoleID
    {
        get
        {
            List<UserRoleInfo> objList = new List<UserRoleInfo>();
            //GetUserRoleList 是具有缓存的
            objList = new BLL.UserRoleBLL().GetUserRoleList(UserID);
            if(objList == null || objList.Count <= 0)
                return null;
            string id = string.Empty;
            foreach(var item inobjList)
            {
                id += item.RoleID + ",";
            }
            return id.TrimEnd(',');
        }
    }

    /// <summary>
    /// 模块编号
    /// </summary>
    private static int ModuleID
    {
        get
        {
            //MODULEID就是地址栏传值的参数
            returnHttpContext.Current.Request.Params["MODULEID"] == null? 0 : Convert.ToInt32(HttpContext.Current.Request.Params["MODULEID"]);
        }
    }



    /// <summary>
    /// 获取用户权限
    /// </summary>
    /// <paramname="permissions">权限名称(PermissionEnum)</param>
    /// <returns>bool</returns>
    public static bool GetPermission(PermissionEnum permissions)
    {
        List<UserModulePermissionInfo> objList = new List<UserModulePermissionInfo>();
        UserModulePermissionBLL objUserModulePermission = new UserModulePermissionBLL();
        foreach(var item inRoleID.Split(','))
        {

           //GetUserModulePermissionByRoleIdList是具有缓存的
           objList.AddRange(objUserModulePermission.GetUserModulePermissionByRoleIdList(Convert.ToInt32(item)));
        }

        if(objList == null || objList.Count <= 0)
            return false;

        UserModulePermissionInfo objInfo = new UserModulePermissionInfo();
        objInfo = objList.Find(t =>t.ModuleID == ModuleID && t.UserID == UserID && t.PermissionCode.ToLower() == permissions.ToString().ToLower());

        if(objInfo == null || objInfo.RoleID <= 0)
            return false;
        else
            return true;
    }
}

 

    这里就是验证用户是对于这个模块是否有权限的验证了,到目前为止,就可以编写权限控件了。正式编写权限控件,我们将在下章进行分析,今天就到此为止吧。

 

有兴趣的朋友,可以根据这章的内容,尝试着编写一下自己的权限控件。

 

下一章的内容以开始着手写了,将很快更新,敬请期待

转载于:https://www.cnblogs.com/luxianai/archive/2012/04/01/tyqx5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通用权限管理框架源码 2013-5-15更新功能: 1、菜单导航管理 2、操作按钮 3、角色管理 4、部门管理 5、用户管理(用户权限) 6、用户组管理(设置成员,用户组权限) 7、系统配置(动态配置系统参数) 8、附加属性(自定义属性) 9、系统日志(异常记录) 10、数据库备份/还原 11、资源管理,(动态数据库) 12、个人信息(基本信息,附加信息,用户角色,拥有权限) 13、首页快捷 14、数据回收站(业务功能删除过数据,全部保留在回收站) 15、系统个性化设置(切换菜单导航) 2012-9-10更新内容: 系统UI,给人感觉非常好,体积小巧,速度快 该源码是适用用于应用系统后台模块的管理(可扩展至支持集中化的权限管理平台), 0.支持N级菜单导航,菜单显示方式支持目前支持2种模式分别:菜单(无限级),横向(2级) 1.动态切换皮肤,目前有两狂UI 蓝色,咖啡色 2.表单验证,文本框高亮起来 3.可以动态分配权限按钮,分配角色权限,目录结构,栏目的链接都可以修改。权限管理非常灵活, 4.可以隐藏左侧导航栏,打开左侧导航栏,默认是打开,table表格都自应大小的 5.动态创建数据表,删除用户表,点击数据 表 可以查询字段信息 6.可以直接执行sql脚本 7.兼容 IE6,7,8,9 /Firefox /Google Chrome 这些浏览器都测试过 8.批量删除,自定义复选框样式,可以全选/反选 9.角色分级,集团和分公司的关系 10.权限 横向就是业务部分,具体负责哪块业务,纵向是级别 11.动态报表设置,并且可以导出Excel 12.登陆日记,操作日记,异常日记 13.海量批量删除数据库,调用公共存储过程,参数,表明,主键 特点: UI:传统html css,美观 漂亮 大方 实用 js框架:jquery 系统大部分使用AJAX操作。大大提高了用户体验 功能描述: 1.支持N级菜单导航,菜单显示方式支持目前支持2种模式分别: 菜单(无限级),横向(2级) 2.表单验证,文本框高亮起来 3.可以动态分配权限按钮,分配角色权限,目录结构,栏目的链接都可以修改。 4.可以隐藏左侧导航栏,打开左侧导航栏,默认是打开,table表格都自应大小的 5.动态创建数据表,删除用户表,点击数据 表 可以查询字段信息 6.可以直接执行sql脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值