gpt4 book ai didi

java - 将序列化过滤器(ObjectInputerFilter)与Keycloak适配器和Memcached一起使用

转载 作者:行者123 更新时间:2023-12-03 16:42:50 24 4
gpt4 key购买 nike

我正在使用Spring Security Keycloak适配器12.0.1和Memcached进行 session 复制。从Memcached加载 session 后,将反序列化Keyclaok适配器中的类。 KeycloakSecurityContext类的read方法包含

DelegatingSerializationFilter.builder()
.addAllowedClass(KeycloakSecurityContext.class)
.setFilter(in);
...为当前 ObjectFilter设置 ObjectInputStream
我发现必须将系统属性 jdk.serialSetFilterAfterRead设置为true,否则会抛出 filter can not be set after an object has been read异常,并且 DelegatingSerializationFilter提示无法设置对象过滤器。结果是根本没有应用任何对象过滤器,并且日志中充满了警告。
应用 jdk.serialSetFilterAfterRead后,我遇到具有memcached属性的 ObjectInputStream包含其他未从 DelegatingSerializationFilter设置为允许类的类,例如:
org.springframework.security.web.savedrequest.DefaultSavedRequest
结果是这些类在序列化过程中被拒绝。
所以我的问题是:有人知道如何配置对象过滤器以使序列化正常工作吗?

最佳答案

怎么了
您的问题是memcached session 处理程序正在同时反序列化许多不同的类。也就是说,使用相同的ObjectInputStream。发生这种情况是因为您的(Tomcat?或任何应用程序服务器,没关系) session 由许多不同的对象组成;因此memcached会将它们一个一序列化到其存储中,然后以相同的方式将它们反序列化回您的应用程序中。除非您反序列化一个棘手的类KeycloakSecurityContext的对象,该对象在ObjectInputStream中引入了邪恶的过滤器,否则这将非常有用。 Link to the evil class
此后发生的情况是,允许允许keycloak类使用,因此可以继续对其进行反序列化,但是现在不可思议地禁止使用所有其他类,因为keycloak通过在其过滤器的末尾添加“!*”来排除所有这些类。 Link to the filter
现在您很头疼strong,并且您在想“胡说八道,我该如何解决?”。我了解,而且我也很头痛,请继续阅读。

解决方案
有多种解决方案(好消息!😀),具体取决于您敢于更改应用程序中内容的程度。
正确的解决方案是确保KeycloakSecurityContext对象(以及引入此类过滤器的任何其他类)在其自己的流中而不是在相同的公共(public)流中反序列化。现在,我不是内存缓存 session 处理程序方面的专家,所以我不知道您实际上对整个 session 反序列化过程有多少控制权。但是我非常有信心入侵它。
如果由于某种原因无法做到这一点,则需要通过扩展该类来覆盖KeycloakSecurityContext中的过滤器。如果您选择此路径(飞行,傻瓜😈),则必须使用过滤器并确定要执行的操作。在这种情况下,我认为最正确的方法是从KeycloakSecurityContext中完全删除过滤器内容,然后在应用程序级别添加一个过滤器,在其中定义所有允许在应用程序中反序列化的类和包
Link on how to do it
另一种方法,有点棘手,但更直接,是在扩展KeycloakSecurityContext的类中的过滤器中添加所有相关的类(严重的是,不要这样做)。

奖励好公民点
有人甚至可能认为这是memcached-session-manager中的错误,或者说是缺少的功能。可能值得在那里开一个问题,看看他们对此有何想法。
https://github.com/magro/memcached-session-manager

现在是硬核的东西
对于无所事事的 Nerd ,对该问题进行了深入的实际说明。
考虑以下情形:您有两种类型的类,AB,这两个类都是SerializableA类是一个简单的,有点天真的类,并且没有在其readObject方法中添加任何自定义过滤器。使用相同的ObjectInputStream反序列化对象:a1, a2, a3, a4。类A的所有实例。
所有对象都正确反序列化,该死! 🐒
相反,B类在readObject中有一个非常卑鄙的过滤器,该过滤器仅允许在当前B中反序列化同一类ObjectInputStream的对象。
现在,我们在流中读取以下对象:a1, b1, a2, b2

  • a1已正确反序列化,我们的ObjectInputStream中目前没有过滤器,太好了!
  • b1已正确反序列化,很酷;但是b1也是一个小问题(是B类的实例),所以它为我们心爱的流设置了一个新的过滤器,而类B是从现在开始唯一允许反序列化的类
  • 然后是a2,它是而不是反序列化的(whaaaat😩),因为b1在上一步中设置了一个不包含类A的过滤器,而都发生在同一ObjectInputStream实例
  • 最后
  • ,因为过滤器
  • 中包含了B类,所以b2正确反序列化了

    关于java - 将序列化过滤器(ObjectInputerFilter)与Keycloak适配器和Memcached一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66583181/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com