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
浙公网安备 33010602011771号