【问题标题】:Spring boot REST token authorization and authentication best practicesSpring boot REST 令牌授权和认证最佳实践
【发布时间】: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


【解决方案1】:

Cookie 方法似乎非常适合用例。令牌可以与用户 ID 绑定。过滤器可以提取 cookie 并将用户 ID 例如作为标头传递给 api - 这应该处理 GET...

【讨论】:

    【解决方案2】:

    您找到解决问题的方法了吗?

    我已经在其他地方回答了这个问题,如果您确定将来不想向其他开发人员/客户开放 API(如果您这样做了,那么您应该查看 OAuth),那么一个简单的基于令牌的解决方案将工作。

    基本上是这样的:

    • 设置一个标准的 html 登录页面,您可以使用它来让用户登录到应用程序
    • 设置 spring security 以在成功登录时返回一个带有身份验证令牌的 cookie
    • 在您的移动应用程序中,嵌入 WebView(或等效项)并加载此登录表单 - 允许用户通过该 webview 登录,响应时获取 cookie 并存储令牌(因为移动设备通常是单用户,您可以保留节省移动用户必须继续登录的时间)
    • 向 REST API 添加一个安全过滤器以针对令牌进行身份验证(例如,从移动应用程序在标头中传递令牌) - 然后您将能够为当前用户使用普通的 spring 身份验证上下文等。李>

    Google 在这里建议了这种方法:(编辑:Google 似乎已将我最初阅读的页面更改为关于使用 Google+ 登录和 OAuth2.0 - 我看不到他们的通用移动/API 文档的链接so here it is in the web archive :) )

    我也在这里写了我的实现:

    Overview of the approach using Spring security

    The code & details

    虽然这实际上只是一个实验/概念证明,但它可能对您的思考有用。

    【讨论】:

    • REST 不应使用 cookie。它是无国籍的。改为使用令牌授权。
    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2023-03-18
    • 2018-02-03
    • 2019-01-09
    相关资源
    最近更新 更多