前台加密,后台解密(1) - Node开发

最近在使用Node开发一个简单的组织内人员管理的项目,人员按照部门的维度来管理,每个部门管理员只能操作自己部门的员工,权限这块的控制我做得比较简单,通过检查是否登陆的中间件来控制路由访问的权限。

// 权限控制,每个访问该路由的请求,都需要先经过checkLogin
router.use(checkLogin);
// checkLogin
module.exports = {
  checkLogin: function (req, res, next) {
    if (!req.session.user) {
      req.flash('error', '未登录');
      return res.redirect('/login');
    }
    next();
  }
};

checkLogin中间件里规定,当session里不存在user,那么对不起,返回登陆页面/loginreq.flash()是什么?点击这里查看,这里不重复介绍了。

好了,回到正题,权限我是通过这种方式实现的,在session里我保存了该部门对应的id,然后我通过该id从后台获取该部门下的员工号。具体实现不多介绍,这样就可以实现登陆指定的用户显示指定部门的人员,显示页面如下:

这样貌似满足了部门管理员只能操作自己部门的人员,而不能查看其他部门人员信息的需求。但是,当我接着做人员详情显示页面时,发现了一个问题,如下图:


这一页是通过点击列表中人名超链接过来的,链接地址:http://http://localhost:3000/user/fom/show?userid=118123,咋一看并没有什么问题,可是回头一想,不对啊,假如另外一个部门的管理员登录后,输入这个链接,同样是可以显示出来的呀,针对这个人员信息页面,只要是登陆用户,数据完全是公开的,并且只要你知道别人的员工号,就可以随时查看信息。因为后台路由是一致的,权限只是控制了是否登陆,并没有检查用户是否属于自己部门的人员。

这个问题的解决有两个方法:

  • 一种比较彻底,就是在显示人员信息的页面加上一个检查中间件:检查显示的用户是否属于登陆管理员的部门人员,只要不是属于自己部门的人员,就跳转显示其他页面。
  • 另一种方法相对比较保守,我把链接复制给你,你才可以查看该人员的信息,而不允许你随便输入员工号来查看。这种方法听起来比较拗口,其实就是要加密urluserid参数值,你想自己输入,对不起输入不了,因为userid参数值是密文,就算你胡乱输入了一个值,也没有用,照样查不到此人信息。

例如显示人员信息的页面url是这样的:http://http://localhost:3000/user/fom/show?userid=18JcpD9C/ngZRSv/fS2t2g==,我看你咋编员工号。

我选择了第二种方法,之前没有接触过加密这块内容,正好借此机会学习一下Node开发的加密功能。好了,具体怎么实现这个功能,下次详解~

【本文只是一个引子】


附:


Comments
Write a Comment