有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用令牌管理请求授权?

我在开发中遇到了一种挑战,基本上我需要授权用户使用令牌访问/调用某些页面/功能,这些页面可以按需设置为需要授权(可能在数据库中设置参数)

这个应用程序是用Struts 1开发的,所以我一直在想的就是使用过滤器截取URL,检查请求是否需要授权,通过电子邮件发送令牌并将用户重定向到“插入令牌”页面,然后再次通过过滤器截取引用者是否是令牌页面并验证值,如果正确,然后重定向到原始请求

然而,我不能简单地恢复之前的请求,而且过滤器拦截ServletRequest和Struts有一个更详细的构造,所以我不能丢失动作或表单对象

我不确定这是否是解决这一需求的好方法,如果是,我需要将原始请求保留在内存中,我不确定如何做到这一点

这是一个遗留项目,有很多页面和控制器,所以仅仅通过每个方法进行验证几乎是不可能的

我愿意接受任何建议,祝你有愉快的一天!:)

编辑

为了添加更多的上下文,该项目有许多用Struts制作的表单,因此Struts在内部将html表单映射到POJO,以将它们作为actions(控制器)方法中的参数:ActionMapping和ActionForm。当我创建过滤器时,我的参数是ServletRequest、ServletResponse和FilterChain对象,我没有ActionMapping或ActionForm,但我知道它们是请求结构的一部分,所以因为我不知道如何直接获取它们,所以我尝试处理整个请求,因此存在安全性和大小问题,还有一个原因是,在执行重定向操作时,我不知道如何存储原始请求的副本


共 (3) 个答案

  1. # 1 楼答案

    我会考虑加密HTTP cookies(如果您的应用程序隐私政策允许cookies)

    您可以存储所需的信息供以后使用,并在一段时间后使其过期。此外,您不需要担心会话存储和扩展。在我看来这很合适

    说到这里,你需要考虑的细节。尤其是cookie加密

    更新

    关于cookie中大对象的注释。创建大HTTP头并不总是一个好主意。大多数web服务器甚至会强制设置头大小的最大值(请参见Maximum on http header values?)。您需要用Base64编码对二进制数据进行序列化,这会使其变得更大

    如果你的对象太大(比如Struts结构),无法放入HTTP头。您可能也不想将它们存储在内存会话中。如果可行的话,您可能需要考虑一个<强>数据库支持的会话< /强>。

    Tomcat(如果这是您的web容器)有一个JDBCStore,您可以configure它。不过,对每个请求/响应进行数据库查询并不好

    在数据库中存储所有会话的另一种方法是仅在数据库中存储该特定对象,并将其关联的密钥存储在HTTP cookie中。考虑到物体的大小,我可能会这么做

    这基本上是内存和速度之间的权衡。(我不知道您的应用程序在资源和性能方面的确切要求)

  2. # 2 楼答案

    考虑到Struts喜欢传递的信息量,我会尝试将会话保存在安全的地方,以便用户返回This post讨论了一个类似的想法,尽管您可以通过令牌保持会话的密钥

    不过,请注意,这一想法将取决于环境,例如,预计用户带着令牌回来的速度,以及需要扩展的用户总数

  3. # 3 楼答案

    在寻找一个合适的解决方案几天后,我决定改变主意,而不是重写(以一种非常不安全的方式)请求,我设计了一个双面解决方案,从前端我使用JavaScript拦截任何请求,我对URL进行初始验证,然后请求令牌,最后,我将发送一个额外的参数,我可以在过滤器中获取该参数,然后在进行验证后,我可以继续原始请求或创建重定向。 谢谢大家给我的时间和建议,我认为最好解释一下我做了什么,而不是把这个话题抛诸脑后