当前位置: 首页 > 知识库问答 >
问题:

使用Spring security在REST中使用标签访问私人图像

逄俊贤
2023-03-14

当前情景

Spring项目使用Spring Security和JWT保护REST API。这些API产生JSON响应。实现了一个UsernamePasswordAuthenticationFilter,用于验证在授权头中发送的JWT。经过身份验证和未经身份验证的API均按预期工作。

要求

现在我需要在HTTP响应中为登录用户发送一个图像。

解决方案

发送一个byte[],将图像表示为图像键的值以及其他信息。但是,如果图像很大,这可能需要一些时间才能获得完整的JSON响应。

解决方案2

将链接作为值与其他信息一起发送到“图像”键。客户端可以分配

我的问题

我更喜欢解决方案2。但由于没有有效的授权令牌,它将产生未授权异常。此外,此API必须经过身份验证。

经过一些搜索,发现了这一点,这是我的要求相同。公认的答案是,

OAuth承载令牌规范支持将令牌作为查询参数发送。

这是我必须做的吗?

  • 在我的Spring过滤器中,从Authorization头中获取JWT,如果它为空,则从请求中获取。getParameter()
  • 在第一个API的JSON响应中,发送“image”:http://ip/getImage?token=dbscsbCXV“
  • 创建一个API@GetMapping(“getImage”)字节[]getImage()

还是有更好的方法?请引导我。


共有1个答案

南门志
2023-03-14

如果您:

  • 服务器使用HTTPS,否则请求头中的JWT令牌将被公开(授权头也是如此)

另一种方法可能是生成一个具有足够熵的随机密钥(例如,将3个UUID组合成一个字符串),并将其与图像实体一起存储,从REST服务返回,例如:

https://ip/images/824b6854-edcc-11e6-bc64-92361f0026713567fef0-549a-4cdb-9264-5e15166dfd6f/the-file-name.pdf

确保禁用这些“公共”路径的Spring Security过滤器。

这种方法的优点:

  • 无需检查此资源的身份验证
  • (如果图像没有改变很多)您可以缓存或通过CDN提供内容,而不是每次都只是流图像。
  • URL将继续工作,即使认证的JWT令牌更改

你可能会认为这比使用每次通话身份验证更不安全,但如果ID有足够的熵,它是防水的。Facebook也使用这个概念(https://www.quora.com/Are-Facebook-pictures-really-private-and-are-they-hosted-on-Facebook-servers, https://en.wikipedia.org/wiki/Capability-based_security)

 类似资料:
  • 我正在尝试使用postman对firebase进行RESTAPI调用。当我的安全规则是允许所有用户,包括未经授权的用户时,我已经设法从firebase读取。 但当我使用这个规则时: 我从邮递员那里得到“错误”:“许可被拒绝”。我为谷歌的web oauth2.0客户端做了请求令牌,并拿回了authorization_code令牌。 我试图在URL和标题中使用令牌,用GET尝试过 请帮忙。提前谢谢

  • 我正在尝试学习Weka:我在这里使用Iris数据集http://storm.cis.fordham.edu/~gweiss/数据挖掘/weka数据/iris。arff公司 其中包含以下字段 从这个数据集中,我试图从这个数据集中提取类标签,它是{Iris setosa,Iris versicolor,Iris virginica} 我不知道如何获得类别标签?任何参考资料

  • 问题内容: 我在使用Tkinter和PIL更新标签时遇到了一个“小”问题。 当我按下起 司 按钮时,它应该显示foo2,但是它只显示白色屏幕。有什么建议? 这是我的代码: 问题答案: 好吧,我认为原因是当您按下按钮时。这是因为此行: 应该: 出现这种情况,是因为,等回报。

  • 一、简介 本章节主要介绍PHPCMS内置模块标签,标签说明及自定义调用数据的方式 二、目录 PC标签使用说明 PC标签保留参数 功能模块 工具箱

  • 标签(Tag),我们需要你!有时 Puppet 的一个类需要知道另一个类,或者至少要知道其是否已存在。 例如,一个管理防火墙的类或许需要知道一个节点是否是 web 服务器。 Puppet 的 tagged 函数会告诉你一个被命名的类或资源是否已经存在于这个节点的目录中。 你还可以对一个节点或类应用任何标签并检查这些标签是否存在。 操作步骤 为了帮你辨别你是否运行在一个指定的节点或一组节点,所有节点

  • 我已经用一些实体设置了JHipster,就像它的主页上描述的那样。AngularJS的前端工作得很好,API页面也让我测试我的服务。 现在,我尝试使用Spring的RestTemplate编写一个REST客户机,如下所示: 但这会导致以下错误:[WARN]org.springframework.web.client.resttemplate-get请求“http://localhost:8080/