在使用插座的气氛的春天应用中用shiro认证主题

问题描述 投票:0回答:1

我有一个Spring-boot Web应用程序,它使用Apache Shiro进行安全管理。 Web应用程序还使用Atmosphere框架进行套接字通信。

在使用它时,我需要验证当我收到/插入请求大气时当前登录的用户。但是,当试图访问Shiro主题时,我收到以下错误:

No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.

我还在我的SecurityManager for / socket中添加了一个过滤器。无论如何,当我尝试使用大气进行套接字连接来验证用户时,我仍然会遇到上述错误。

我在网上搜索了很多,并没有找到解释发生了什么的答案。我发现很多帖子提到了大气使用的线程池与分配给servlet请求的帖子不同。因此,到达大气层的异步请求没有原始用户的上下文。我还读了一个解决方法here,这是相当古老的。我也试过了评论中提到的一些东西。

注意:我是Spring,Shiro和Atmosphere框架的新手。我从更系统层面的角度理解事物。

如果我能得到一些解释(或某些可能有帮助的链接),我会非常感谢这些事情的发生以及产生上述错误的原因。我所阅读的大部分在线资料似乎都非常模糊,并未作为独家答案。

如果我在Spring应用程序启动时没有弄错,它还会加载Shiro和Atmosphere相关的类。请求到达Apache服务器并根据注释委托给类。 Spring / Apache存储每个请求信息(一些cookie或会话令牌)和后续请求根据此映射。但是,存储在与Atmosphere相关的请求(ex:onRequest)端点和其他端点之间的信息不会被共享,因此我无法使用相同的主题信息。

我真诚地搜索了许多试图了解并希望得到精心解释的内容。我希望这个问题不被认为不适合论坛。

谢谢 沙比尔

apache spring-boot web shiro atmosphere
1个回答
0
投票

看看Thread Association in Shiro的文档

你的假设似乎是正确的(猜测我从未使用过Atmosphere)。线程池是不同的。通常有两种方法可以解决这个问题。一些框架允许您将数据添加到“上下文”,您可以从正在运行的线程中提取数据(非常类似于Servlet或Spring上下文)。另一个选项(假设您有权管理Atmosphere线程),您可以将它们包装在:

Subject.execute(...)
© www.soinside.com 2019 - 2024. All rights reserved.