人
在我现有的api上我已经使用Bearer安全性进行了用户身份验证。使用http标头api_key和后来的标记。
我的问题似乎是我有不同的终点,只需要根据角色消费。
例如发布新用户:
POST user should only be authenticated to user with admin role.
我查看了APK splits但我没有找到关于他们的文档和谷歌的内容。
请给我一些脑力激荡的想法?以下是我在 nodejs和express中的访问验证码。
swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
// Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain
app.use(middleware.swaggerMetadata());
app.use(middleware.swaggerSecurity({
Bearer: function(req,def,apiKey,next){
apiKey= apiKey.slice(7)
debug("token check",def,apiKey)
var ok=checkToken(apiKey)
if(ok) {
req.user=ok
debug('Token is ok')
return next()
}
debug("Invalid token",apiKey)
var err=Error("Invalid token")
err.statusCode=403
next(err)
}
}));
答案 0 :(得分:2)
在撰写本文时,解决方案仍然是自制的。 Swagger没有,通过oAuth范围或使用" hacky" api-key安全定义(https://stackoverflow.com/a/40222161/3736937),具有内置的RBAC机制。
幸运的是,我们可以创建一些非常基本的中间件来处理这个问题,因为swagger允许我们将x-swagger- *成员添加到swagger定义中。
所以这就是我所做的:
将x-swagger-roles添加到需要RBAC(基于角色的访问控制)的每个端点
paths:
"/":
x-swagger-router-controller: getStatus
get:
operationId: getStatus
x-swagger-roles:
- admin
tags:
- "users"
summary: "Returns message: 'working'"
description: "default endpoint for testing"
responses:
$ref: "#/definitions/AnyResponse"
在向应用程序注册 swagger-node-runner之前放置中间件。在我们的例子中,我们使用了expressjs,因此使用了连接中间件。
var findOne = function (haystack, arr) {
return arr.some(function (v) {
return haystack.indexOf(v) >= 0;
});
};
app.use(function(req, res, next) {
var operation = runner.getOperation(req);
if(operation && operation.definition) {
var definition = operation.definition;
var requiredRoles = definition['x-swagger-roles'];
// if the endpoint has no required roles then go to the next route
if(!requiredRoles) return next();
// get the users roles
var userRoles = req.session.roles; // this may differ for you
// if any roles match then go to the next route
if(findOne(userRoles, requiredRoles)) return next();
// if no roles match then assert that this endpoint is forbidden
else return res.sendStatus(403);
}
next();
})
// it's important to register the middleware after the role check
runner.expressMiddleware().register(app);
注意:
此代码尚未在生产中进行测试,应由安全专业人员审核。
x-swagger-roles不会在没有改变的情况下出现在你的swagger-ui中,这超出了这个答案的范围。