权限设计——状态模式

来源:互联网 发布:手机淘宝抢拍神器 编辑:程序博客网 时间:2024/05/09 11:00

        前一段公司准备开发一个二期项目,打算在原来的基础上新增一些功能模块,并且能够适合更多种用户使用。这样就面临一个问题,权限的设计问题。原来只是简单的分了几个角色,根据不同角色,分配不同的功能模块。这个让我想起了以前在学校做项目的时候,简单的分用户类型。没有想到来公司做项目后,还是使用这种,写死的东西,根本没法重用。

        后来我提出了一个假设,如果我要新增加一个角色,要重新给他分配功能(在原来已有的功能基础上),因为是在已有的基础上,自然希望能够不修改代码,直接分配,这个时候,写死的东西就相形见绌了。

        其实当初做毕业设计的时候,我的指导老师曾经提出过,使用字符串来管理权限,字符串的每一位对应一个功能,这样的话,权限分配会相对于比较灵活。其实,一开始也是把角色写死,给固定的权限串,我的毕业设计师做一个BS项目,是一个ASP.NET的网站。所以根据字符串动态生成页面,只不过每个角色对应的权限字符串是固定的。然而这只是一个开头,由于需求一直在变化,我天天改权限字符串,我感觉很烦,就开始考虑,能不能动态修改权限字符串(当然了,增加一个功能模块,肯定要改的,因为字符串要加一位)。

        经过一番思考,我把角色放在数据库中,建立一个角色表,Role(流水号,角色名,角色权限串)。同时又建立一个权限串表。PermissionsString(字符位置,aspx地址,功能描述)。根据这俩张表,当一个用户登录的时候,获取对应的权限串,再拆分权限串,获取每一位权限对应的功能,跟生成一个string字符串,动态加载页面。其中字符串“01010111...”这种形式,0,代表没有这个功能;1,代表有这个功能。所以1,就会获得权限串表中对应的aspx地址,0的话,就跳过。

        上面是动态生成首页,根据权限串,分别获得不同的链接。而修改角色的权限,可以使用checkbox,获取一个角色对应的权限串,动态生成页面,然后,打钩就获取该功能。下面是以前动态生成角色权限管理的代码,减少了很多,主要还是想说的是,可以动态修改权限。

        public string getPrivilege1()
        {
            BLL.SystemManageBLL bll = new BLL.SystemManageBLL();
            //获取全部权限列表
            List<Privilege> listPrivilege = new List<Privilege>();
            listPrivilege = bll.getlistPrivilege();
            char[] arrPrivilege = this.arrPrivilege();  //获取权限字符数组
            StringBuilder strArrange = new StringBuilder();

            strArrange.Append("<ul style=\"display:none;\">");
            for (int i = 0; i < listPrivilege.Count(); i++)//遍历所有用户列表
            {  

                   strArrange.Append("<li><input type=\"checkbox\" id=" + listPrivilegeID[j].ID.ToString()  +" onclick=\"SelectNodes(this)\"/><label for=" + listPrivilegeID[j].ID.ToString() + ">" + listPrivilegeID[j].PermissionName + "</label> ");

                    strArrange.Append("</li>");
            }

            strArrange.Append("</ul>");
            return strArrange.ToString();
        }

        // <summary>
        /// 获得用户权限串分解的字符串数组
        /// </summary>
        /// <returns></returns>
        public char[] arrPrivilege()
        {
            string existPrivilege = strPrivilege();
            if (existPrivilege != ""&&existPrivilege!=null)
            {
                char[] arrPrivilege = existPrivilege.ToCharArray();
                return arrPrivilege;    
            }
            else
            {
                return null;
            }
        }

        如果要新增加一个角色,就可以动态的为这个新增的角色选择功能。

        而上面的是我当时做毕业设计时,总结的,后来我看了状态模式,我又重新构思了一下,发现可以去掉权限串表(PermissionsString),只留下一个角色表(Role)。而结合状态模式。把每一个子字符看成一个状态,其中字符内容(0,1)和字符位置(int)是状态的两个属性。如果增加功能模块,就可以增加一个状态。同时,权限字符串设长些,没有的预先设为”0“。

         这些都是一些个人想法,如果大家觉得哪里不对,可以指出来,一起讨论。

原创粉丝点击