UNPKG

restframework-express

Version:

ES6新特性,使用class来定义API接口,集成认证,权限,序列化,版本,视图,频率,过滤等公共能,插拔式设计模式

87 lines (71 loc) 2.51 kB
const {BasePermission} = require("../permissions") let express = require("express") const {BaseAuthentication} = require("../authentications"); const {AuthenticationFailed, PermissionDenied} = require("../exceptions"); const {SimpleRateThrottle} = require("../throttling") let app = express() app.use(express.json()) let router = express.Router() let {APIView} = require("../views") class MyAuthentication extends BaseAuthentication { authenticate(req) { let username = req.body.username if (username) { // select * from user where username = username // user = select * from user where username = username let user = username return [user, null] } throw AuthenticationFailed("认证失败") } } class MyPermission extends BasePermission { hasPermission(req) { // 我们在用户认证中 给request 添加一个 user属性, 这个属性是从数据库重查询出来的,如果你使用orm查询 你可以直接使用 user的链式操作 let user = req.user // type: Array //role = user.roles let role = { "admin": ["admin", "menus"], "custom": ["menus"] } let needRole = ["admin", "menus"] let userRole = role[user] || [] console.log(userRole) needRole.map(r => { if (userRole.indexOf(r) === -1) { throw new PermissionDenied("权限认证失败") } }) return true } } // 全局的 restful 配置 const api_settings = require("../settings") // type: Object // 设置 scope = "test" 的 rate = '3/m' 每分钟限制3次访问 api_settings.DEFAULT_THROTTLE_RATES = { test: '3/m' } class MyRateThrottle extends SimpleRateThrottle { // 给当前自对应的频率组件给个标志 scope = "test" // 局部的配置 替换全局的配置的 scope 对应的 rate // THROTTLE_RATES = { // test: '3/m' //} getCacheKey(req, view) { return this.cacheFormat(this.scope, this.getIdent(req)) } } class MyAPIView extends APIView { // permissionClasses = [MyPermission] // authenticationClasses = [MyAuthentication] throttleClasses = [MyRateThrottle] get(req, res, next) { console.log(req.connection.remoteAddress) console.log(req.ip) return res.json({hello: "restful"}) } } router.all("/", MyAPIView.asView()) app.use("/", router) app.listen("3000", "0.0.0.0")