【发布时间】:2015-02-23 10:35:06
【问题描述】:
REST spring boot 中用户授权和认证的最佳实践是什么?
我正在使用标准页面 + 用于移动设备的 REST API 构建 Web 应用程序。我查看了许多关于 Spring 安全性的文章,基本上它们中的大多数都采用了某种允许或阻止 REST 调用的 fitler 方法。但是,就我而言,我有一些基于用户身份的身份验证逻辑。例如,有一个/update API 更新用户信息,用户可以更新自己,但不能更新其他人。
最初我想使用下一个身份验证模式:
- 用户调用身份验证 API 并传递名称/密码或 cookie
- 系统生成寿命短的令牌,保存在它的数据库中。
- 用户获取此令牌,更新他的 cookie(以便 Web 应用程序中的 JS 可以读取和使用它)
- 在进行 REST 调用时,会传递 cookie。在 Controller 中,提取令牌,检查是否过期,对数据库进行查询以验证令牌并获取用户 ID。
- 根据用户 ID,允许或阻止 REST。
这是正确的实施方法吗?在阅读了有关 Spring Boot 安全性的文章后,我的脑子里一片混乱。 至少:会话身份验证对我不起作用(REST 是无状态的)。我想在不存储登录名/密码的情况下为移动设备进行身份验证。
在 REST 主体本身中传递这个令牌是否有意义?如果是 GET 方法呢?
非常感谢您分享您的知识。
【问题讨论】:
-
只是好奇,但是您认为存储在数据库中的令牌状态优于存储在会话中的身份验证状态的优势是什么(这更容易使用,因为您不必处理持久性)?
-
Rest 是无状态的。没有会话。第二:在这两种情况下(即使使用会话),您都需要将会话值存储在某处。有的用redis,我要persistense。
-
安全需求状态。 TCP 是有状态的。因此,如果您想使用其中任何一个,您将不会是无国籍的。在 cmets 中讨论 stackoverflow 是毫无意义的,但我认为您应该重新评估您的优先级(或重新定义“无状态”)。
标签: rest spring-mvc spring-security spring-boot