我对开发有一些挑战,基本上我需要授权用户使用令牌去/调用某些页面/功能,这些页面可以设置为需要按需授权(可能在一个设置中设置一个参数)数据库)。
应用程序是使用Struts 1创建的,所以我一直在想的只是使用过滤器拦截URL,检查请求是否需要授权,通过电子邮件发送令牌并将用户重定向到“插入令牌”页面,然后再次通过过滤器拦截,如果引用者是令牌页面并验证值,如果正确,然后重定向到原始请求...
但是我不能简单地恢复以前的请求,也过滤拦截ServletRequest和Struts有更详细的构造,所以我不能松动动作或表单对象。我不确定这是否是解决此需求的好方法,如果是这样,我需要将原始请求保留在内存中,我不知道该怎么做。
这是一个遗留项目,并且有很多页面和控制器,所以通过每个方法进行验证几乎是不可能的。
我会接受任何建议,祝你有愉快的一天! :)
修改
为了添加更多上下文,项目有很多使用Struts构建的表单,因此内部Struts将html表单映射到POJO,以将它们作为动作(控制器)方法中的参数:ActionMapping和ActionForm。当我创建一个过滤器时,我的参数是ServletRequest,ServletResponse和FilterChain对象,直接我没有ActionMapping或ActionForm,但我知道它们是请求结构的一部分,所以因为我不知道如何获取它们直接,我正在尝试处理整个请求,因此安全性和大小问题,还因为我不知道如何在我进行重定向操作时存储原始请求的副本
答案 0 :(得分:0)
考虑到Struts喜欢传递的信息量,我很想在某个地方保持一个安全的会话以便用户返回。 This post讨论了类似的想法,尽管你可能只是通过令牌来保持会话的密钥。
意识到这个想法会取决于环境,例如预计用户返回令牌的速度有多快,以及需要缩放的用户总数。
答案 1 :(得分:0)
I would have considered encrypted HTTP cookies (if your application privacy policy allows cookies).
You can store the required information for later use and expire it after a while. Also, you don't need to be concerned about session storage and scaling. Seems to me fits the bill.
Having said that, there're details that you need to consider. In particular cookie encryption.
Update
A note on big objects in cookie. Creating big HTTP header is not always a good idea. Most web servers even force a maximum on header size (see Maximum on http header values?)。您需要使用Base64编码序列化二进制数据,这使其更大。
如果您的对象非常大(如Struts构造),则不适合HTTP标头。您可能也不想将它们存储在内存会话中。如果可行,您可能需要考虑数据库支持的会话。
Tomcat(如果这是您的网络容器)有一个JDBCStore,您可以configure。但是,对每个请求/响应进行数据库查询都不是很好。
将所有会话存储在数据库中的替代方法是仅将该特定对象存储在数据库中并将其关联的密钥存储在HTTP cookie中。考虑到对象的大小,我可能会这样做。
这基本上是内存和速度之间的权衡。 (我不知道您的应用程序在资源和性能方面的确切要求)。
答案 2 :(得分:0)
在寻找合适的解决方案几天之后,我决定改变想法,而不是重写(以非常不安全的方式)请求,我设计了一个双方解决方案,从前端我使用JavaScript拦截任何请求,我做了URL的初始验证,然后要求令牌,所以最后我发送了一个我可以在过滤器中获得的附加参数,然后在进行验证后,我可以继续原始请求或创建重定向。 感谢所有人的时间和建议,我认为更好地解释我做了什么,而不是把这个话题留在空中。