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


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

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

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

    比如:

    现在的地址栏是: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;
        }
    }

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

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

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

  • 相关阅读:
    oracle权限配置
    oracle锁表处理
    小组成员
    个人项目 Individual Project
    Java单元测试框架 JUnit
    MyEclipse的快捷键大全(超级实用,方便)
    vs2008 连接 vss2005 出现 analyze utility 错误的解决方法
    EXTJS gridpanel 动态设置表头
    IE8不能上网的问题
    一些事件的评论
  • 原文地址:https://www.cnblogs.com/luxianai/p/tyqx5.html
Copyright © 2020-2023  润新知