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

Spring boot REST令牌授权和身份验证最佳实践,rest,spring-mvc,spring-security,spring-boot,Rest,Spring Mvc,Spring Security,Spring Boot,REST spring引导中用户授权和身份验证的最佳实践是什么 我正在为手机构建带有标准页面+RESTAPI的web应用程序。我看了很多关于Spring安全性的文章,基本上大部分都采用了某种fitler方法,允许或阻止REST调用。然而,在我的例子中,我有一些基于用户身份的身份验证逻辑。例如,有一个更新用户信息的/updateAPI,用户可以更新自己,但不能更新其他人。 最初我想使用下一个身份验证模式: 用户调用auth API并传递名称/密码或cookie 系统生成短生命令牌,保存在其数据库

REST spring引导中用户授权和身份验证的最佳实践是什么

我正在为手机构建带有标准页面+RESTAPI的web应用程序。我看了很多关于Spring安全性的文章,基本上大部分都采用了某种fitler方法,允许或阻止REST调用。然而,在我的例子中,我有一些基于用户身份的身份验证逻辑。例如,有一个更新用户信息的
/update
API,用户可以更新自己,但不能更新其他人。 最初我想使用下一个身份验证模式:

  • 用户调用auth API并传递名称/密码或cookie
  • 系统生成短生命令牌,保存在其数据库中
  • 用户获取此令牌,更新其cookie(以便web应用程序中的JS可以读取和使用它)
  • 在进行REST呼叫时,发送cookies。在控制器上,提取令牌,检查其是否过期,对数据库进行查询以验证令牌并获取用户id
  • 根据用户id,REST将被许可或阻止
这是正确的实施方法吗?读了关于spring boot安全性的文章后,我的脑子里乱七八糟。 至少:会话身份验证对我不起作用(REST是无状态的)。我想在不存储登录/密码的情况下对移动设备进行身份验证

将这个标记传递给其他身体本身有意义吗?如果使用GET方法,该怎么办


非常感谢分享您的知识。

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

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

基本上是这样的:

  • 设置一个标准的html登录页面,您可以使用该页面进行用户登录
  • 设置spring security以在成功登录时使用身份验证令牌返回cookie
  • 在您的移动应用程序中,嵌入一个WebView(或同等版本)并加载此登录表单-允许用户通过该WebView登录,在响应时抓取cookie并存储令牌(由于移动设备通常是单用户,您可以保留相当长的时间,以避免移动用户不得不继续登录)
  • 向RESTAPI添加一个安全过滤器,以针对令牌进行身份验证(例如,从移动应用程序将令牌传递到标头中),然后您将能够为当前用户使用正常的spring身份验证上下文等
这种方法是谷歌在这里提出的:(编辑:谷歌似乎已将我最初阅读的页面更改为关于使用Google+登录和OAuth2.0的页面-我看不到他们通用移动/API文档的链接:)

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


尽管这实际上只是一个实验/概念验证,但在您的思考中可能会很有用。

Cookie方法似乎非常适合这个用例。令牌可以与用户id绑定。筛选器可以提取cookie并将用户id作为头传递给API—这应该可以处理GET…

只是好奇,但您认为存储在数据库中的令牌状态比存储在会话中的身份验证状态有什么优势(因为您根本不需要处理持久性,所以使用哪一个更容易)?Rest是无状态的。没有会话。第二:在这两种情况下(即使使用会话),您需要将会话值存储在某个位置。有些人使用redis,我需要persistense。安全性需要状态。TCP是有状态的。因此,如果您想使用其中任何一种,您都不会是无状态的。在stackoverflow的评论中进行讨论毫无意义,但我认为您应该重新评估优先级(或重新定义“无状态”).REST不应使用Cookie。它是无状态的。请改为使用令牌授权。