2015年2月

我们做企业级系统,权限控制主要分三类。

【功能权限】:对菜单栏目进行权限控制,查询,增加,删除,修改功能,一般来说这种对资源的权限控制模型可以做到比较统一(用户、角色、资源)。

【数据权限】:哪些人能看到哪些数据,例如淘宝本人只能看自己订单,北京地区部门领导可以看到电器类部门订单, 最高领导能看到人所有订单等等。 这种跟业务高度相关,(网络上资料暂时比较少)原理主要是对SQL语句添加where 条件

【字段权限】:订单能看到哪些字段,如供应商,看不到内部价、 出厂价等信息。 (网络上资料暂时比较少)实现原理跟数据权限控制是一致的。对SQL语句添加select 条件

这次,我们主要讲解最常用的功能权限控制的实现过程,这类WEB权限控制,在任意后端语言上都可以实现Java、Golang、PHP、Nodejs、Python等等,主要理解其数据模型。

我们先看最终实现的功能效果。

1.角色管理页面

image.png

这里可以新增角色,删除角色, 注意的是,这里有一个最高权限角色超级管理员,不允许删除,还有一个批量导入管理员默认角色。

2.新增角色,编辑角色

image.png

这里把系统大部分资源路由进入权限控制,说的大部分是因为有些页面权限是不需要进行控制,例如登陆、注册、以及后台一些下拉选项(读取的数据库接口)。

3.管理员列表

image.png

4.给管理员分配权限

image.png

涉及数据表

1.用户表

用户表主要增加字段 rolesId 角色ID,了解这个用户是哪个角色。

2.角色表

角色表主要记录这个角色的名称,描述
CREATE TABLE `t_roles` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名称',
  `desc` varchar(50) NOT NULL DEFAULT '' COMMENT '描述',
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

3.路由表

这个表主要添加平台所有需要控制的路由方法,也可以不建表,写到配置文件里面,因为开发完需要控制的权限是固定的。上图:新增编辑角色,显示的就是这个表的内容
CREATE TABLE `t_roles_tree` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '' COMMENT '路由名称',
  `path` varchar(50) NOT NULL COMMENT '路径',
  `methods` varchar(50) NOT NULL COMMENT '方法',
  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `parentId` varchar(50) NOT NULL DEFAULT '' COMMENT '级别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='系统所有路由表';

4.权限表

权限表记录了,这个角色有哪些权限。 核心字段为 [角色ID,资源url, 方法]。这里用casbin 实现,因为casbin封装了很多验证函数,节省了一部分工作量。
CREATE TABLE `casbin_rule` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `p_type` varchar(255) NOT NULL DEFAULT '',
  `v0` varchar(255) NOT NULL DEFAULT '' COMMENT '角色',
  `v1` varchar(255) NOT NULL DEFAULT '' COMMENT 'Url',
  `v2` varchar(255) NOT NULL DEFAULT '' COMMENT '方法',
  `v3` varchar(255) NOT NULL DEFAULT '',
  `v4` varchar(255) NOT NULL DEFAULT '',
  `v5` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=utf8mb4;

权限逻辑.png

这一篇最后介绍下 Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。并指出主流后端语言,目前Casbin权限控制支持的语言有Go Java Node.js PHP Python C# Delphi,使用Casbin可以极大提高权限控制开发效率。当然你不用这个库,自己设计表,实现原理是一样。

Faas(Functions-as-a-Service ) 函数即服务,四大升级,助力移动开发。

云函数支持小程序语法

云函数升级,支持JavaScript语法操作数据库,以后会JavaScript,或者小程序开发,即可开发云函数,不再需要学习新的云函数语法。

升级一:语法升级

查询2条用户信息

小程序,H5写法

const query = Bmob.Query("_User");
  query.limit(2)
  query.find().then(res => {
    console.log(res)
  }).catch(err => {
    console.log(err)
 });

云函数写法

function onRequest (request, response, modules) { //系统内置代码
  
  let Bmob = modules.oBmob;
  const query = Bmob.Query("_User");
  query.limit(2)
  query.find().then(res => {
    const b = JSON.stringify(res)
    response.send(b);
  }).catch(err => {
    const e = JSON.stringify(err);
    response.end(e)
  });

}                                                                                    

运行效果

http://cloud.bmob.cn/c8bed465c9e6a524/aabb

升级二:web预览升级

1.外观升级

曾经云函数,返回直接返回一个json数据不美观,也不好看。

image.png

现在可视化展现接口细节。如果用浏览器直接打开一个 API 地址通常会得到一坨神奇的 JSON。

使用 restc 之后不仅格式化高亮了结果,而且还可以看到 HTTP 响应头。并且支持参数调试

image.png

对比:

image.png

2.功能升级

参数调试介绍:

云函数代码,接收参数name,点击send,打印:欢迎使用Bmob

  function onRequest(request, response, modules) {
      //获取SDK客户端上传的name参数
      var name = request.body.name;
      if(name == 'bmob')
        response.end('欢迎使用Bmob');
      else
        response.end('输入错误,请重新输入');
    }

image.png

这里感谢下饿了么团队,开源这么好用的HTTP 服务器中间件

升级三:开发调试升级

我们用网页编写云函数时,经常函数没写完,不小心忘记保存关闭了网页,代码需要重新写。新出的Bmob云函数本地开发调试工具,不再会发生这种问题。本地开发工具绑定Bmob应用,写好代码,命令自动上传,并返回函数结果。

使用文档地址:

https://github.com/bmob/bmobup

升级四:函数模板服务

年初,我们推出了函数模板服务,当你需要写一些常用功能代码时,可以使用我们的函数模板服务。例如你想开发公众号,有菜单管理函数、自动回复函数, 如果你想开发小程序,有手机号解密函数模板,如果你先采集数据,有数据采集模板。

如果你写了个功能,觉得大家可能用得上,也可以发布分享给大家使用,大家创建的时候只需要选择需要的模板即可。

image.png

大家对云函数有更多需求,可以给我提建议喔。