3.MVC大项目第三天(权限初)

   统一的错误过滤器如果是mvc底层的错误 比如404需要在配置文件中指定返回的对应的控制器  通过action跳转到指定的error页面
 
   eval:可以将方法名为字符串的数据转化为方法的指针
 
   当我们设置配置文件保存的时候就会立即将session 和 cookie删除
  
   权限初体验:
   步骤:
  1:根据用户id编写一个存储过程,获取所有的权限菜单和按钮数据
  2:在用户登录成功后,调用存储过程传入我们需要的参数(一般只需要一个登录后的用户id)
  3:将权限数据存入缓存httpruntime.cache里面
  4:当用户点击任何一个菜单的时候获取菜单id 从缓存数据中获取 当前菜单的权限按钮返回给浏览器程序出来即可,没权限则不显示
  5: 注意:当用户直接从浏览器发出指定的url一样可以操作   所以我们需要创建一个全局的权限过滤器  来进行对每一个action截获处理  并且增加一个黑名单来跳过权限检查
 
 权限实现步骤:注意我们是在登录的时候将权限数据设置到缓存中的
 1:查看数据库中的表的权限表和各个我们需要被设计的表的关系
 
 登录判断(登录特性标签)  
 2:我们是在登录验证的特性标签中,如果用户登录成功那么我们就直接传入用户id调用IBLL层中的实现权限数据的方法
 
 3:我们先从缓存中根据对应的缓存key获取到缓存数据  
 
 4:如果获取到的缓存数据为空,那么我们直接调用我们写好的设置权限的存储过程将我们的用户id获取到缓存数据,将获取到的权限数据和缓存key加进缓存中
 
 5:如果我们在第3步获取到了缓存那么我们直接将获取到的换数据返回
 
 权限判断(权限特性标签)
 6:在执行权限判断的时候会根据用户由登录的用户id和前缀组成的缓存key去获取到缓存(权限数据)
 
 7:如果没有获取到那么就表示当前登录的用户没有该页面的访问权限,直接提示,否则 直接显示页面
 
 代码:
 BLL层中设置权限的代码:
          定义一个缓存 key 确保每个 用户拥有一份缓存数据
          string cacheKey = "permisslistall"+uid;
 
          先从 缓存根据key获取数据 我们可能是第二次登录
          List<usp_KeyValue_Result> list = CacheMgr.GetData<List<usp_KeyValue_Result>>(cacheKey);
          //判断获取到的缓存数据是否为空 如果为null那么我们就将从储存过程中获取到的数据存进缓存中
          if (list==null||list.Any()==false)
          {
              //调用 存储过程 来获取权限数据
              list = base.RunSql<usp_KeyValue_Result>("usp_KeyValue " + uid); //注意我们是根据用户主键id来获取的
 
              //将list存入缓存中
              CacheMgr.SetData(cacheKey,list); //如果用户没有
          }
          return list;
 
 设置权限的储存过程:
 ALTER PROCEDURE [dbo].[usp_KeyValue]
 @uid int--用户id
AS
BEGIN
   
 SET NOCOUNT ON;--关闭可提高性能
 --编写存储过程中的链表就是 需要显示的数据的表当作主表 而被连的表只需要在on中输入的于主表的主外建关系 最后在from中输入你需要显示的数据
 select f.fID,f.fName,f.fPicname,f.fFunction,m.mID,m.mUrl,m.mArea,m.mController,m.mAction from sysFunction f //方法表
 inner join sysPermissList p on(f.fID=p.fID) //权限表
 inner join sysUserInfo_Role ur on(p.rID=ur.rID and ur.uID=@uid)//用户表
 inner join sysMenus m on(m.mID=p.mID) //菜单表
END

 

posted on 2015-05-10 17:47  阿兴的平凡世界  阅读(152)  评论(0)    收藏  举报

导航