简介
hapi-swagger-rbac是一个npm包,可实现在hapi框架下对swagger文档进行基于角色的访问控制,其依赖于hapi-swagger插件。通过此插件,可以在实现API接口文档的同时,方便地进行API的权限控制,提高系统的安全性。
安装
在使用hapi-swagger-rbac之前,需要先安装hapi框架和hapi-swagger插件,具体安装过程请参考官方文档。
安装hapi-swagger-rbac需要使用npm,执行以下命令进行安装:
npm install hapi-swagger-rbac --save
使用
注册插件
在hapi服务器中注册hapi-swagger-rbac插件,可以通过options参数进行配置。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ----- - ----------------- ----- ------ - ------------------ ----- ----------- - ------------------------ ----- --------------- - ----------------------------- ----- ------ - --- ------------- ----- ------------ ----- ---- --- ----- -------- ------ - ----- -------------- - - ----- - ------ ---- --------------- -------- ----- - -- ----- ------------------ - - ------ --------- -------- -- ---- --------------- ----- --------- -- - -- ---------------------- -- ---------------- ----- --------- -- - -- --------------------- - -- ----- ----------------- ------ ------- - ------- ------------ -------- -------------- -- - ------- ---------------- -------- ------------------ - --- ----- --------------- ------------------- ------- ----- ----------------- - -------
配置角色和权限
在上述代码中,我们已经定义了两个角色:admin和user。在getUserRoleFunc函数中,应该返回当前用户的角色,可以基于数据库中的用户信息或者通过其他方式获取。
除了角色以外,我们还可以定义每个角色对应的权限。例如,对于角色为admin的用户,可以访问所有的API接口,而对于角色为user的用户,则只能访问部分API。在hapi-swagger-rbac中,可以通过addScope方法来添加每个角色的权限。
-- -------------------- ---- ------- ----- ------------------ - - ------ --------- -------- -- ---- --------------- ----- --------- -- - -- ---------------------- -- ---------------- ----- --------- -- - -- --------------------- -- --------- ------ ------ ------- -- - -- ------- ------------- ---- ------- ---------------------- --- ------------------ ------------------------------ - ------ ---- -------- ------------------------------ ------------------------------- -------------------------------- ------ - - --
在上述代码中,我们为角色为user的用户添加了read:user-info权限,表示该用户可以访问/api/user/info接口。对于角色为admin的用户,我们添加了三个权限:read:user-info、read:admin-info、write:admin-info。这意味着该用户可以访问/api/user/info接口,并且可以读取或写入admin相关的信息。
使用swagger文档
完成了上述配置后,我们就可以在swagger文档中使用hapi-swagger-rbac插件。默认情况下,权限控制只会影响UI界面的展示,不会影响API接口的实际访问。
首先,我们需要在swaggerOptions配置对象中添加securityDefinitions和security字段,用于指定安全方案和所需的权限。例如,对于上述配置中的user和admin角色,我们可以配置如下的securityDefinitions:
-- -------------------- ---- ------- ----- -------------- - - ----- - ------ ---- --------------- -------- ----- -- -------------------- - ----- - ----- --------- ----- ----------- ----------------- --------------------------------------- ------- - ----------------- ----- ---------- - -- ------ - ----- --------- ----- ----------- ----------------- --------------------------------------- ------- - ----------------- ----- ----------- ------------------ ----- ------------ ------------------- ------ ----------- - - -- --------- - - ----- ------------------ -- - ------ ------------------ ------------------ ------------------- - - --
在securityDefinitions中,我们指定了两个安全方案:user和admin。在这两个方案中,我们指定了对应角色的授权方式、授权url和权限范围。在security字段中,我们指定了每个接口所需的安全方案和需要的权限。
指定了securityDefinitions和security后,我们还需要使用security注解来应用到每个API接口中。在swagger-rbac注解中,我们可以使用tags属性来指定每个接口所属的标签,以及security属性来指定需要的安全方案和权限。
-- -------------------- ---- ------- --- - -------- - - --------------- - ---- - ------------ --- ---- ---- - ----- - - ---- - --------- - - ----- ------------------ - ---------- - ---- - ------------ -- --
在上述代码中,我们为/api/user/info接口添加了security注解,并指定了user安全方案和read:user-info权限。
权限验证
在完成了上述配置和使用后,我们就可以进行权限验证了。在hapi-swagger-rbac插件中,默认情况下会自动根据设置的安全方案和权限限制API的访问。如果用户没有所需的角色和权限,将无法访问API接口,并返回403 Forbidden错误。
在getUserRoleFunc和isLoggedInFunc中,需要使用到request对象,可以通过添加request模块来实现。在示例代码中,我们可以参考以下的实现:
-- -------------------- ---- ------- ----- ------- - --------------------------- ----- ------------------ - - ------ --------- -------- -- ---- --------------- ----- --------- -- - ----------------------------------- ----- --- -------------------- ------ --- -------- - ----- ----- - ---------------------------------------------- -- ---- ----- -------- - ----- --------- ------- ------- ---- ------------------------------------- -------- - -------------- ------- --------- - --- ----- ---- - --------------------- ---------------- ----- --- -------------- -------- - ------ ----- -- ---------------- ----- --------- -- - ----- ----- - ---------------------------------------------- -- ---- ----- -------- - ----- --------- ------- ------- ---- -------------------------------- -------- - -------------- ------- --------- - --- ----- ---- - --------------------- ----- ---- - ---------- --------------------------------------------- ----- --- ------------------ ---- ---------- - ------ ----- -- --------- ------ ------ ------- -- - -- ------- ------------- ---- ------- ---------------------- --- ------------------ ------------------------------ - ------ ---- -------- ------------------------------ ------------------------------- -------------------------------- ------ - - --
在isLoggedInFunc中,我们先解析Authorization头中的token,然后向认证服务器发起验证请求。如果token有效,则返回true,否则会抛出异常。
在getUserRoleFunc中,我们同样解析Authorization头中的token,然后向用户管理服务器发起请求,获取当前用户的角色。如果获取的角色未在配置中定义,则同样会抛出异常。
除了使用request模块外,我们还可以在isLoggedInFunc和getUserRoleFunc中使用其他方式进行验证,例如基于数据库的验证、基于LDAP的验证等。
总结
在本文中,我们介绍了npm包hapi-swagger-rbac的使用方式。这个npm包可以帮助我们在hapi框架下实现swagger文档的基于角色的访问控制。通过本文的介绍,我们可以了解到如何在hapi服务器中配置hapi-swagger-rbac插件、配置角色和权限、使用swagger文档,在isLoggedInFunc和getUserRoleFunc中进行验证等。hapi-swagger-rbac可以帮助我们提高API接口的安全性,避免数据泄露和非法访问。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005581f81e8991b448d54a6