在 Javalin 中创建安全的 REST API
在 Javalin 中创建安全的 REST API
依赖项
首先,我们需要创建一个带有一些依赖项的 Maven 项目:(→ 教程)
创建控制器
我们需要一些值得保护的东西。假设我们有一个非常重要的 API,用于操作用户数据库。我们创建一个控制器对象,其中包含一些虚拟数据和 CRUD 操作:
创建角色
现在我们已经有了功能,我们需要为系统定义一组角色。这可以通过实现RouteRole接口来实现io.javalin.security.RouteRole
。我们将定义三个角色,一个代表“任何人”,一个代表读取用户数据的权限,一个代表写入用户数据的权限。
设置 API
现在我们有了角色,我们可以实现我们的端点:
现在每个端点都被赋予了一个角色:
- ANYONE能getAllUserIds
- USER_READ能getUser
- USER_WRITE可以createUser,updateUser并且deleteUser
现在,剩下的就是实现访问管理(Auth::handleAccess)。
实现授权
我们的访问管理器的规则很简单:
- 当端点有时ApiRole.ANYONE,所有请求将被处理
- 当端点有另一个角色集并且请求具有匹配的凭据时,该请求将被处理
- 否则,我们将停止请求并401 Unauthorized返回给客户端
这很好地转化为代码:
从上下文中提取用户角色
Javalin 中没有内置的ctx.userRoles
或userRoles(ctx)
,所以我们需要实现一些东西。首先,我们需要一个用户表。我们将创建一个表,map(Pair<String, String>, Set<Role>)
其中键是明文形式的用户名+密码(请不要在实际服务中这样做),值是用户角色:
现在我们有了用户表,我们需要对请求进行身份验证。我们从Basic-auth-header中获取用户名+密码 ,并将它们用作以下键userRoleMap:
使用基本身份验证时,凭证将以纯文本形式传输(尽管经过 base64 编码)。 如果您在实际服务中使用基本身份验证,请务必启用 SSL。
结论
就这样!现在您拥有一个包含三个角色的安全 REST API。
作者:Jeebiz 创建时间:2025-05-04 00:18
最后编辑:Jeebiz 更新时间:2025-05-04 00:55
最后编辑:Jeebiz 更新时间:2025-05-04 00:55