RBAC(Role-Based Access Control,基于角色的访问控制),用户基于角色的访问权限控制。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般都是多对多的关系。如图所示:
sql_tool
在本案例中,采用的就是这种权限设计的方式。具体的sql语句脚本如下:
1 | CREATE TABLE `user` ( |
初始化以下的sql脚本,即给用户id为1的用户关联角色,角色并关联权限:
1 | INSERT INTO `permission` VALUES ('1', '/user/orgs'); |
在本案例中,需要根据user表中的Id获取该Id对应的权限。首先根据userId获取该用户对应的角色,再根据根据该角色获取相应的权限,往往一个用户具有多个角色,而角色又有多个权限。比如查询userId为1 的用户的权限的sql语句如下:
1 |
|
在Openresty中怎么连接数据库,怎么查询sql语句,在之前的文章已将讲述过了。根据用户id获取用户的权限的功能是一个使用率极高的功能,所以考虑将这个功能模块化。
vim /usr/example/lualib/sql_tool.lua ,编辑加入以下的代码:
1 | local mysql = require("resty.mysql") |
在上面的代码中,有一个select_user_permission(user_id)方法,该方法根据用户名获取该用户的权限。查出来存在一个table 类型的 local permissions={}中。
vim /usr/example/example.conf 加上以下的代码:
1 | location ~ /sql_tool{ |
在浏览器上访问http://116.196.177.123/sql_tool,浏览器显示如下的内容:
/user/orgs
tokentool
在之前的文章讲述了如何使用Openresty连接redis,并操作redis。 这小节将讲述如何使用openresty连接redis,并写几个方法,用于存储用户的token等,并将这些信息模块化,主要有以下几个方法:
- close_redis(red) 通过连接池的方式释放一个连接
- connect() 连接redis
- has_token(token) redis中存在token 与否
- get_user_id(token) 根据token获取用户id
- set_permissions(user_id,permissions) 根据userid设置权限
- get_permissions(user_id)根据userid获取权限
vim /usr/example/lualib/tokentool.lua 编辑一下内容:
1 | module("tokentool", package.seeall) |
vim /usr/example/lua/test_token_tool.lua,加上以下的内容:
1 | local tokentool= require "tokentool" |
在/usr/example/example.conf加上以下的内容:
1 | location ~ /token_tool{ |
打开浏览器访问http://116.196.177.123/token_tool,浏览器显示:
ok