如何使用令牌管理请求授权?
How to manage request authorization with tokens?
我在开发方面遇到了一些挑战,基本上我需要授权用户 go/call 到某些 page/functionality 使用令牌,这些页面可以设置为需要按需授权(也许在数据库中设置参数)。
应用程序是用 Struts 1 创建的,所以我一直在想的只是使用过滤器拦截 URL,检查请求是否需要授权,通过电子邮件发送令牌并将用户重定向到 "insert token" 页面,如果 referer 是令牌页面,则再次通过过滤器拦截并验证值,如果正确,则重定向到原始请求...
但是我不能简单地恢复以前的请求,过滤器拦截 ServletRequest 并且 Struts 有更详细的构造,所以我不能松开动作或表单对象。
我不确定这是否是解决此需求的好方法,如果是这样,我需要将原始请求保留在内存中,但我不确定该怎么做。
这是一个遗留项目,有很多页面和控制器,所以几乎不可能只通过每个方法进行验证。
我会接受任何建议,祝你有美好的一天! :)
编辑
为了添加更多上下文,该项目有许多使用 Struts 制作的表单,因此在内部 Struts 将 html 表单映射到 POJO,以将它们作为操作的参数(控制器)方法:ActionMapping 和 ActionForm。当我创建一个过滤器时,我的参数是 ServletRequest、ServletResponse 和 FilterChain 对象,直接我没有 ActionMapping 或 ActionForm,但我知道它们是请求结构的一部分,所以因为我不知道如何获取它们直接地,我正在尝试处理整个请求,因此存在安全和大小问题,还因为我在执行重定向操作时不知道如何存储原始请求的副本
考虑到 Struts 喜欢传递的信息量,我很想为用户 return 将会话保存在安全的地方。 This post 讨论了类似的想法,尽管您可以只让会话以令牌为键。
意识到这个想法将取决于环境,例如预计用户会以多快的速度返回令牌,以及这需要扩展的用户总数。
我会考虑加密的 HTTP cookie(如果您的应用程序隐私政策允许 cookie)。
您可以存储所需信息以备后用,并在一段时间后过期。此外,您无需担心 session 存储和缩放。在我看来符合要求。
话虽如此,您还是需要考虑一些细节。特别是 cookie 加密。
更新
关于 cookie 中大 object 的注释。创建大型 HTTP header 并不总是一个好主意。大多数 Web 服务器甚至强制最大 header 大小(请参阅 Maximum on http header values?)。您需要以 Base64 编码序列化二进制数据,这会使它变得更大。
如果您的 object 非常大(如 Struts 构造)无法放入 HTTP header。您可能也不想将它们存储在 in-memory session 中。如果可行,您可能需要考虑 数据库支持 session。
Tomcat(如果这是您的 Web 容器)有一个 JDBCStore and you can configure。这不是很好,对每个 request/response.
进行数据库查询
将所有 session 存储在数据库中的替代方法是 仅将特定的 object 存储在数据库中并将其关联的密钥存储在 HTTP cookie 中.鉴于 object.
的大小,这就是我可能会做的
这基本上是内存和速度之间的 trade-off。 (我不知道您的应用程序在资源和性能方面的确切要求)。
在寻找合适的解决方案几天后,我决定改变想法,而不是重写(以一种非常不安全的方式)请求,我设计了一个双向解决方案,从前端拦截任何请求使用 JavaScript,我对 URL 进行初始验证,然后请求令牌,所以最后我发送了一个额外的参数,我可以在过滤器中获取该参数,然后在完成验证后,我可以继续原始请求或创建重定向。
谢谢大家的时间和建议,我认为最好解释一下我做了什么,而不是把这个话题悬而未决。
我在开发方面遇到了一些挑战,基本上我需要授权用户 go/call 到某些 page/functionality 使用令牌,这些页面可以设置为需要按需授权(也许在数据库中设置参数)。
应用程序是用 Struts 1 创建的,所以我一直在想的只是使用过滤器拦截 URL,检查请求是否需要授权,通过电子邮件发送令牌并将用户重定向到 "insert token" 页面,如果 referer 是令牌页面,则再次通过过滤器拦截并验证值,如果正确,则重定向到原始请求...
但是我不能简单地恢复以前的请求,过滤器拦截 ServletRequest 并且 Struts 有更详细的构造,所以我不能松开动作或表单对象。
我不确定这是否是解决此需求的好方法,如果是这样,我需要将原始请求保留在内存中,但我不确定该怎么做。
这是一个遗留项目,有很多页面和控制器,所以几乎不可能只通过每个方法进行验证。
我会接受任何建议,祝你有美好的一天! :)
编辑
为了添加更多上下文,该项目有许多使用 Struts 制作的表单,因此在内部 Struts 将 html 表单映射到 POJO,以将它们作为操作的参数(控制器)方法:ActionMapping 和 ActionForm。当我创建一个过滤器时,我的参数是 ServletRequest、ServletResponse 和 FilterChain 对象,直接我没有 ActionMapping 或 ActionForm,但我知道它们是请求结构的一部分,所以因为我不知道如何获取它们直接地,我正在尝试处理整个请求,因此存在安全和大小问题,还因为我在执行重定向操作时不知道如何存储原始请求的副本
考虑到 Struts 喜欢传递的信息量,我很想为用户 return 将会话保存在安全的地方。 This post 讨论了类似的想法,尽管您可以只让会话以令牌为键。
意识到这个想法将取决于环境,例如预计用户会以多快的速度返回令牌,以及这需要扩展的用户总数。
我会考虑加密的 HTTP cookie(如果您的应用程序隐私政策允许 cookie)。
您可以存储所需信息以备后用,并在一段时间后过期。此外,您无需担心 session 存储和缩放。在我看来符合要求。
话虽如此,您还是需要考虑一些细节。特别是 cookie 加密。
更新
关于 cookie 中大 object 的注释。创建大型 HTTP header 并不总是一个好主意。大多数 Web 服务器甚至强制最大 header 大小(请参阅 Maximum on http header values?)。您需要以 Base64 编码序列化二进制数据,这会使它变得更大。
如果您的 object 非常大(如 Struts 构造)无法放入 HTTP header。您可能也不想将它们存储在 in-memory session 中。如果可行,您可能需要考虑 数据库支持 session。
Tomcat(如果这是您的 Web 容器)有一个 JDBCStore and you can configure。这不是很好,对每个 request/response.
进行数据库查询将所有 session 存储在数据库中的替代方法是 仅将特定的 object 存储在数据库中并将其关联的密钥存储在 HTTP cookie 中.鉴于 object.
的大小,这就是我可能会做的这基本上是内存和速度之间的 trade-off。 (我不知道您的应用程序在资源和性能方面的确切要求)。
在寻找合适的解决方案几天后,我决定改变想法,而不是重写(以一种非常不安全的方式)请求,我设计了一个双向解决方案,从前端拦截任何请求使用 JavaScript,我对 URL 进行初始验证,然后请求令牌,所以最后我发送了一个额外的参数,我可以在过滤器中获取该参数,然后在完成验证后,我可以继续原始请求或创建重定向。 谢谢大家的时间和建议,我认为最好解释一下我做了什么,而不是把这个话题悬而未决。