Spring Boot REST令牌授权和身份验证最佳实践

6
什么是REST Spring Boot中用户授权和认证的最佳实践?
我正在构建一个包含标准页面和面向移动设备的REST API的Web应用程序。我查阅了许多关于Spring安全性的文章,基本上大部分都采用一些过滤器方法来允许或阻止REST调用。然而,在我的情况下,我有一些基于用户的身份验证逻辑。例如,有一个名为/update的API,用于更新用户信息,用户可以更新自己的信息,但不能更新其他人的信息。
最初,我想使用以下身份验证方案:
1. 用户调用身份验证API并传递名称/密码或Cookie。 2. 系统生成短期令牌,并将其保存在数据库中。 3. 用户获取此令牌,更新其Cookie(以便Web应用程序中的JS可以读取和使用它)。 4. 进行REST调用时传递Cookie。在Controller中,提取令牌,检查其是否过期,查询数据库以验证令牌并获取用户ID。 5. 根据用户ID,REST将被允许或阻止。
这是否是实施的正确方法?在阅读有关Spring Boot安全性的文章后,我脑子里一团糟。至少:会话身份验证对我无效(REST是无状态的)。我想为移动设备进行身份验证,而不在其中存储登录/密码。
将此令牌本身传递到REST正文中是否有意义?对于GET方法呢?
非常感谢您分享您的知识。

只是好奇,您认为将令牌状态存储在数据库中相比于将身份验证状态存储在会话中的优势是什么(后者更容易处理,因为您根本不必处理持久性)? - Dave Syer
Rest是无状态的,没有会话。其次,在这两种情况下(即使有会话),您都需要在某个地方存储会话值。一些人使用Redis,但我想要持久性。 - Tigran
安全需要状态。而TCP是有状态的。因此,如果您想使用它们中的任何一个,您就不会是无状态的。在stackoverflow的评论中进行这种毫无意义的讨论是没有意义的,但我认为您应该重新评估您的优先事项(或重新定义“无状态”)。 - Dave Syer
2个回答

3

你解决问题了吗?

我已经在其他地方回答了这个问题,如果你确定不想将API开放给其他开发者/客户端(如果你打算这样做,那么你应该考虑OAuth),那么一个简单的基于令牌的解决方案就可以解决问题。

大致上是这样的:

  • 设置一个标准的HTML登录页面,用于用户登录应用程序
  • 设置Spring Security,在成功登录时返回一个身份验证令牌的Cookie
  • 在你的移动应用程序中,嵌入一个WebView(或等效物)并加载此登录表单-允许用户通过该WebView登录,在响应中获取Cookie并存储令牌(因为移动通常是单用户,所以可以将其保持相当长的时间以节省移动用户的登录次数)
  • 向REST API添加安全过滤器以根据令牌进行身份验证(例如,从移动应用程序传递令牌的标头),然后您将能够使用普通的Spring身份验证上下文来处理当前用户等等。
这种方法是Google在这里建议的:(编辑:Google似乎已经更改了我最初阅读的页面,变成了关于使用Google+登录和OAuth2.0的页面 - 我找不到他们的一般移动/API文档的链接所以在Web存档中在这里 :))
我也在这里写了我的实现: 使用Spring Security的方法概述 代码和详细信息 尽管这只是一个实验/概念验证,但它可能对你的思考有用。

3
REST不应该使用cookies,因为它是无状态的。相反,应该使用令牌授权。 - Daniel Christopher

0

Cookie方法似乎非常适合这种情况。令牌可以与用户ID绑定。过滤器可以提取cookie并将用户ID作为标头传递给API,这应该可以处理GET请求...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接