在sail.js上进行身份权限控制

前言

先说一下业务需求:一个页面上有很多tab,每个tab都表示一个页面,现在想使用不用的身份来使用不同的tab(页面)。简单地讲,从View层上进行身份权限控制。所以这里主要讲的是在Sail.js上如何实现View层的“Polices”。

笔者的项目环境:Sails.js作为后台,前端使用jade

实现思路

创建不同身份,使用一个字段id_type来进行区分,每种身份可被配置可访问的页面有哪些,然后渲染页面的时候就只显示这些页面(tabs)。例如:

4: [                        // 身份类型为 4
                            // 这里配置的可以访问哪些tab(页面)
    {
      en : '/tab_one_url',
      cn : '首页'
    },
    {
      en : '/tab_two_url',
      cn : '个人页'
    },
    ......
]

实现

创建不同身份

作为一个系统,身份管理一般都不了的,按照上面的思路的话,只需原来身份model那里添加多一个字段id_type即可,如果原来已有一个唯一识别的字段,重用这个字段也是可以的。如下:

{
    "user_name": {
      "type": "string"
    },

    "password": {
      "type": "string"
    },

    "id_type" : {
      "type" : "integer"
    }
}

修改好model之后,就可以进行CRUD啦,具体怎么做,涉及到项目需求、实际情况的,每个项目的做法都是不一样的,因此不再展开。

获取身份权限

配置一个权限文件,例如,accessControl.js文件,内容如下:

4: [                        // 身份类型为 4
                            // 这里配置的可以访问哪些tab(页面)
    {
      en : '/tab_one_url',
      cn : '首页'
    },
    {
      en : '/tab_two_url',
      cn : '个人页'
    },
    ......
]

这里配置的只是其中一种身份,可以根据需求,配置多个身份。

使用Session传递数据

当用户登录成功时,添加上一段session代码,如下:

req.session.accessControl = accessControl[user.id_type];

目的就是在渲染jade模板时,传递给jade模板,这样就可以控制渲染什么样的前端页面了,这里更多是体现在导航栏上的tab。如果看过我写的上一篇文章从问题到解决方案之学习sailjs的polices的话,其实就是在View_renderController.js文件下添加多一行代码,以获取权限数据,代码如下:

order : function (req, res) {
    res.view('koala/order', {
        title: 'xxx',
        accessControl : req.session.accessControl
    });
}

到此为止,基本上把方案实现了,当然在后期,可以在前端这边添加更多细节的控制,例如,给一些敏感信息进行控制显示不完整,常见的做法就是前后预留几位字符,中间则用****表示。如下:

xxx****xxx

然后可以写成配置文件的形式,具体实现的细节就不展开了,代码实例如下:

4: {
  AAAA: {
    isCompleted: false,
    beginNumber: 4,
    endNumber: 4,
    symbol: '****'
  },

  BBBB: {
    isCompleted: true,
    beginNumber: 1,
    endNumber: 0,
    symbol: '**'
  },

  CCCC: {
    isCompleted: false,
    beginNumber: 4,
    endNumber: 4,
    symbol: '****'
  },

  DDDD: {
    isCompleted: true,
    beginNumber: 4,
    endNumber: 4,
    symbol: '****'
  }
}
Spy 07 April 2015