zoukankan      html  css  js  c++  java
  • 权限管理系统-将权限授权给角色

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

    过了个年回来,回顾一下,我们上次讲了角色管理,我们这一次来讲将权限授权给角色,这一节也是大家比较关心的。因为我们已经跑通了整个系统,知道权限的流转,我们先来看一张图

    这张图主要分要3块,角色组----系统模块----操作码授权

    选择角色组(表示要授权的角色,选择需要授权的模块,最后授权操作码。当存在一个操作码时候,我们应该改变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层的代码即可

    比较繁琐的还是Controller层和页面UI的代码,这些先贴出

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using Microsoft.Practices.Unity;
    using App.IBLL;
    using App.Models;
    using App.Common;
    using App.Models.Sys;
    
    namespace App.Admin.Controllers
    {
        public class SysRightController : BaseController
        {
            //
            // GET: /SysRight/
            [Dependency]
            public ISysRightBLL sysRightBLL { get; set; }
            [Dependency]
            public ISysRoleBLL sysRoleBLL { get; set; }
            [Dependency]
            public ISysModuleBLL sysModuleBLL { get; set; }
            [SupportFilter]
            public ActionResult Index()
            {
                ViewBag.Perm = GetPermission();
                return View();
            }
            //获取角色列表
            [SupportFilter(ActionName = "Index")]
            [HttpPost]
            public JsonResult GetRoleList(GridPager pager)
            {
                List<SysRoleModel> list = sysRoleBLL.GetList(ref pager, "");
                var json = new
                {
                    total = pager.totalRows,
                    rows = (from r in list
                            select new SysRoleModel()
                            {
    
                                Id = r.Id,
                                Name = r.Name,
                                Description = r.Description,
                                CreateTime = r.CreateTime,
                                CreatePerson = r.CreatePerson
    
                            }).ToArray()
    
                };
    
                return Json(json);
            }
             //获取模组列表
            [SupportFilter(ActionName = "Index")]
            [HttpPost]
            public JsonResult GetModelList(string id)
             {
                 if (id == null)
                     id = "0";
                 List<SysModuleModel> list = sysModuleBLL.GetList(id);
                 var json = from r in list
                            select new SysModuleModel()
                            {
                                Id = r.Id,
                                Name = r.Name,
                                EnglishName = r.EnglishName,
                                ParentId = r.ParentId,
                                Url = r.Url,
                                Iconic = r.Iconic,
                                Sort = r.Sort,
                                Remark = r.Remark,
                                Enable = r.Enable,
                                CreatePerson = r.CreatePerson,
                                CreateTime = r.CreateTime,
                                IsLast = r.IsLast,
                                state = (sysModuleBLL.GetList(r.Id).Count > 0) ? "closed" : "open"
                            };
    
    
                 return Json(json);
             }
    
             //根据角色与模块得出权限
            [SupportFilter(ActionName = "Index")]
            [HttpPost]
            public JsonResult GetRightByRoleAndModule(GridPager pager, string roleId, string moduleId)
             {
                 pager.rows = 100000;
                 var right = sysRightBLL.GetRightByRoleAndModule(roleId,moduleId);
                 var json = new
                 {
                     total = pager.totalRows,
                     rows = (from r in right
                             select new SysRightModelByRoleAndModuleModel()
                             {
                                Ids= r.RightId+ r.KeyCode,
                                Name= r.Name,
                                KeyCode =r.KeyCode,
                                IsValid=r.isvalid,
                                RightId=r.RightId
                             }).ToArray()
    
                 };
    
                 return Json(json);
             }
            //保存
            [HttpPost]
            [SupportFilter(ActionName = "Save")]
            public int UpdateRight(SysRightOperateModel model)
            {
                return sysRightBLL.UpdateRight(model);
            }
    
    
        }
    }
    复制代码
     Index

    最后效果图

    这次发布还是做得比较认真的。大家可以详细细读代码和存储过程。不清楚的欢迎留言,必定回答

    接下来是讲角色和用户的互相授权,有兴趣的朋友可以先做做看。

  • 相关阅读:
    Win10 anaconda python3.6 安装pcap
    跨平台 GUI可视化 网络调试工具
    参考文献相关概念
    linux压缩和解压缩命令大全[转]
    PowerShell 惠普打印机双面驱动自动设置已安装
    CentOS7 一键安装KMS服务【整理】
    pdf转word OCR
    CentOS7 MySQL
    PDF文件比对工具
    pdf文件中截取eps图片并压缩
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3547755.html
Copyright © 2011-2022 走看看