我正在使用类似RESTAPI的API构建一个数据交换服务器。它并不是严格意义上的RESTful,因为服务器持有一些状态,但我跑题了。会话是使用HTTP身份验证和预先分配的API密钥的组合构建的。API密钥允许服务器控制客户端可以访问哪些资源,以及在使用时可以采取哪些操作
- 每个用户可以有多个密钥,但每个会话只能有一个密钥
- 某些密钥必须具有"平面"权限:它们只能查看和操作单独存储或以其他方式创建的数据
- 其他键具有分层或基于角色的权限:除了查看和操作从属于它们的键之外,它们还可以执行平面键所能执行的所有操作
- 将来,一些密钥可能会被授予创建、注册和委派自己的从属密钥的特殊权限
- 总体而言,对所有资源的所有访问都将在"默认拒绝"的基础上进行
考虑到这些要求,并考虑到未来的考验,我有什么样的选择来实现这一点?我已经研究了很多基于ACL和/或基于角色的访问控制的解决方案,但我遇到的解决方案中没有一个能够实现这种细粒度的访问控制。
我最终简化了系统需求:我没有使用API-keys作为会话标识符,而是使用完整的"RESTful"路由,并根据设计用于处理请求的LDAP后端对每个请求进行身份验证。
对于授权,我使用LDAP中分配给用户的组集合作为该用户的"角色"。它不像最初的设计那样灵活,但它足够实用,我可以在未来更改应用程序层,而不用担心在用户和权限设置后移植它们。