欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(24)-权限管理系统-将权限授权给角色

程序员文章站 2023-11-01 18:04:28
选择角色组(表示要授权的角色,选择需要授权的模块,最后授权操作码。当存在一个操作码时候,我们应该改变SysRight表中的rightflag字段,表示他有权限。不知道大家是否还记得...
选择角色组(表示要授权的角色,选择需要授权的模块,最后授权操作码。当存在一个操作码时候,我们应该改变SysRight表中的rightflag字段,表示他有权限。不知道大家是否还记得,这个图也是我们要做的。由于图中用的是JQGrid看起来跟Easyui有点差别,但是方式却是一样的)

 

回到头看到SysRightOperate表的IsValid,我们将授权角色和模块和操作码这3张表关联起来,其中IsValid字段是来标识是否有操作的权限,当第一次授权,那么是向SysRightOperate添加一条记录,如果下次更新先判断是否已经授权如果没有,那么删除或者更新IsValid,我这里是更新,你也可以删除掉,一样的道理。

 

之前我们已经新建过SysRight这个表的DAL层和BLL层了,根据想法,我们只要建立多两个方法

 

更新SysRightOperate(即上面所说)

和按选择的角色及模块加载模块的权限项(确定操作码是否被授权,即图中的复选框)

现在向ISysRightRepository添加2个方法

 

//更新

int UpdateRight(SysRightOperate model);

//按选择的角色及模块加载模块的权限项

List<P_Sys_GetRightByRoleAndModule_Result> GetRightByRoleAndModule(string roleId, string moduleId);

 

 

P_Sys_GetRightByRoleAndModule_Result这个是存储过程,由于这2个方法比较复杂,这里用存储过程来做

 

复制代码

Create proc [dbo].[P_Sys_GetRightByRoleAndModule]

@roleId varchar(50),@moduleId varchar(50)

as

--按选择的角色及模块加载模块的权限项

begin

select a.Id,a.Name,a.KeyCode,a.ModuleId,ISNULL(b.IsValid,0) as isvalid,a.Sort,@roleId+@moduleId as RightId

    from SysModuleOperate a

    left outer join(

        select c.Id,a.IsValid from SysRightOperate a,SysRight b, SysModuleOperate c

        where RightId in

        (select Id From SysRight where RoleId =@roleId and ModuleId =@moduleId)

         and a.RightId=b.Id

         and b.ModuleId=c.ModuleId

         and a.KeyCode =c.KeyCode) b

     on a.Id = b.Id

     where a.ModuleId =@moduleId

end

 

    

复制代码

所以必须要把这个存储过程添加到EF,并生成复杂类型的实体P_Sys_GetRightByRoleAndModule_Result

 

 

 

然后创建P_Sys_UpdateSysRightRightFlag

 

复制代码

Create proc [dbo].[P_Sys_UpdateSysRightRightFlag]

@moduleId varchar(200),@roleId varchar(200)

as

begin

--计算上级模块的rightflag标识

declare @count int

--第一层:由操作权限项计算模块权限

select @count=COUNT(*) from SysRightOperate where RightId=@roleId+@moduleId and IsValid=1

 

if(@count>0)

begin

    update SysRight set Rightflag=1 where ModuleId=@moduleId and RoleId=@roleId

end

else

begin

    update SysRight set Rightflag=0 where ModuleId=@moduleId and RoleId=@roleId

end

--计算下一层

declare @parentId varchar(50)

set @parentId=@moduleId

 

while(@parentId<>'0')

begin

    select @parentid=ParentId from SysModule where Id=@parentId

    if (@parentId is null)

    begin

        return

    end

    

    select @count=COUNT(*) from SysRight where ModuleId in

        (select Id from SysModule where ParentId=@parentId)

        and RoleId =@roleId

        and Rightflag=1

    

    if(@count>0)

    begin

        update SysRight set Rightflag=1 where ModuleId=@parentId and RoleId=@roleId

    end

    else

    begin

        update SysRight set Rightflag=0 where ModuleId=@parentId and RoleId=@roleId

    end

end

end

复制代码

这个是计算上级模块的rightflag标识也就是开头所说的RightFlag字段,这个字段将决定导航条的显示,所以每一次授权操作都要执行

 

下面添加SysRightRepository逻辑代码

 

复制代码

  public int UpdateRight(SysRightOperateModel model)

        {

            //转换

            SysRightOperate rightOperate = new SysRightOperate();

            rightOperate.Id = model.Id;

            rightOperate.RightId = model.RightId;

            rightOperate.KeyCode = model.KeyCode;

            rightOperate.IsValid = model.IsValid;

            //判断rightOperate是否存在,如果存在就更新rightOperate,否则就添加一条

            using (DBContainer db = new DBContainer())

            {

                SysRightOperate right = db.SysRightOperate.Where(a => a.Id == rightOperate.Id).FirstOrDefault();

                if (right != null)

                {

                    right.IsValid = rightOperate.IsValid;

                }

                else

                {

                    db.SysRightOperate.AddObject(rightOperate);

                }

                if (db.SaveChanges() > 0)

                {

                    //更新角色--模块的有效标志RightFlag

                    var sysRight = (from r in db.SysRight

                                    where r.Id == rightOperate.RightId

                                    select r).First();

                    db.P_Sys_UpdateSysRightRightFlag(sysRight.ModuleId, sysRight.RoleId);

                    return 1;

                }

            }

            return 0;

        }

        //按选择的角色及模块加载模块的权限项

        public List<P_Sys_GetRightByRoleAndModule_Result> GetRightByRoleAndModule(string roleId, string moduleId)

        {

            List<P_Sys_GetRightByRoleAndModule_Result> result = null;

            using (DBContainer db = new DBContainer())

            {

                result = db.P_Sys_GetRightByRoleAndModule(roleId,moduleId).ToList();

            }

            return result;

        }

复制代码

按照习惯,我们要向IBLL 和BLL 添加代码,大家自行添加访问DAL层的代码即可