java - 使用本地数据库的 WSO2 API Manager 最终用户自定义身份验证策略
问题描述
对于通过 Web 浏览器通过 Internet 访问的 Web 应用程序门户,需要在 WSO2 API 管理器中实现以下身份验证流程。
- 应用程序的最终用户(Portal-Web 瘦客户端)必须使用用户/密码方案登录。
- 用户和凭证信息存储在本地应用程序 RDBMS 数据库(例如 MySQL)中。
- 应用程序有用户管理屏幕来添加/删除/更新用户和映射角色。
- API 管理器必须根据本地用户存储对用户进行身份验证并生成 JWT/Ouath2 令牌。
- 需要配置自定义密码策略(例如,用户必须在尝试 5 次失败后锁定)。
- 最终用户将使用生成的令牌访问受保护的 API。
- API Manager 应该授权令牌并将 API 路由到适当的微服务。
从文档中我们发现,应创建辅助用户存储以允许应用程序的最终用户成为 WSO2 API Manager 用户的一部分,因此身份验证将由 API Manager 本身负责。我想更好地了解如何实现这一点。
- 通过应用程序中的用户管理屏幕,最终用户数据库中的预期变化是非常动态的,这是否需要以某种方式更新到 API 管理器用户存储?或者API manager用户存储可以配置直接从适用的用户表中读取。?
- API 管理器可以针对每个用户执行在应用程序数据库中配置的加密密码验证吗?
- 是否有任何替代方法,例如,我的应用程序公开一个用于身份验证的休息端点,并且 API 管理器通过传递作为令牌 api 的一部分接收的用户名和密码来调用此端点来执行身份验证。
解决方案
您可以将应用程序的用户存储作为 API Manager 中的辅助存储并满足您的要求。有关详细信息,请参阅有关配置辅助用户存储的官方文档。
此外,如果您有 JDBC 用户存储,那么您可以在 API Manager 中自定义辅助用户存储的查询以正确查询用户条目。此外,您还可以实现自定义用户存储管理器和插件(如果您有更多自定义字段和操作)。
回答您的问题
通过应用程序中的用户管理屏幕,最终用户数据库中的预期变化是非常动态的,这是否需要以某种方式更新到 API 管理器用户存储?或者API manager用户存储可以配置直接从适用的用户表中读取?
不,除非您没有正确配置用户存储,否则不需要在 API Manager 中执行任何手动更改。但是,请注意,如果您计划使用应用程序用户存储中的用户来创建 API 并在 API 平台中订阅,删除这些用户可能会导致平台中的行为不一致。
API 管理器可以针对每个用户执行在应用程序数据库中配置的加密密码验证吗?
您可以编写自定义用户存储管理器来处理您喜欢的密码验证。
是否有任何替代方法,例如,我的应用程序公开一个用于身份验证的休息端点,并且 API 管理器通过传递作为令牌 API 的一部分接收的用户名和密码来调用此端点来执行身份验证。
我可以想到另一种 REST API 方法。即开发一个自定义处理程序并将其与 API 结合以执行除令牌验证之外的验证。简单来说,
- 开发突触处理程序
- 将处理程序与 API 以及默认值一起使用
APIAuthenticationHandler
- 从自定义处理程序中的 Transport 标头中读取并提取
username
andpassword
- 调用应用程序的 REST 端点并检查有效性
- 如果成功,则继续 API 调用(继续进行通常的令牌验证过程和所有操作),如果不成功,则放弃并返回错误消息
但是,请注意,此外部验证过程需要足够快,以免长时间阻塞 API 管理器。
推荐阅读
- java - 将第一个、第二个和第三个 int 扫描器值分配给 3 个不同的队列
- html - 在 Angular 中为多个路由添加 Active 类
- javascript - 在html中单击链接更改占位符
- javascript - 对字符串中的字母进行排序
- javascript - Babel-loader 在包含 3rd 方库后停止转译箭头函数
- sql - sql oracle中的当前日期
- qt - 如果文件夹中的文件存在,如何检查 30 秒?
- ruby-on-rails - Sidekiq 使用哪些 Redis 命令?
- android - Sendgrid Android 插件初始化错误“java.lang.NoSuchFieldError: No static field INSTANCE of type .../AllowAllHostnameVerifier”
- c# - C# 中的 Websocket,任何 nuget 包都允许更改 nic?(网络接口卡)