Shiro 向 DefaultSecurityManager 抱怨“没有 id xxx 的会话”

2024-03-07

我在一个长期运行的应用程序中使用 Apache Shiro 1.2.0,该应用程序从队列中读取消息并采取操作。所采取的操作需要 Shiro 进行身份验证的会话,因此我实现了一个“ActAsAuthenticationToken”和自定义凭据匹配器,它允许我们仅使用用户名登录。我使用的 DefaultSecurityManager 仅注入了我的自定义领域和主题工厂。其他一切都应该是默认的。

配置完成后,一切都运行良好一段时间,但随着应用程序运行很长时间(不是那么长 - 就像一整天),每当我执行任何需要会话的操作时,我就开始获取此堆栈跟踪:

Caused by: org.apache.shiro.session.UnknownSessionException: There is no session with id [f5b7c3bf-2c53-40e9-a707-37f4265970aa]
    at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170)
    at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236)
    at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222)
    at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:105)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:109)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.getAttribute(AbstractNativeSessionManager.java:206)
    at org.apache.shiro.session.mgt.DelegatingSession.getAttribute(DelegatingSession.java:141)
    at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121)
    at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121)
    at org.apache.shiro.session.ProxiedSession.getAttribute(ProxiedSession.java:121)
    at com.factorlab.security.FactorlabDelegatingSubject.getUser(FactorlabDelegatingSubject.java:34)
    at com.factorlab.security.FactorlabDelegatingSubject.getUser(FactorlabDelegatingSubject.java:10)
    at com.factorlab.persistence.AbstractEntityDao.getCurrentUser(AbstractEntityDao.java:227)
    at com.factorlab.persistence.AbstractEntityDao.fireEvent(AbstractEntityDao.java:215)
    at com.factorlab.persistence.AbstractEntityDao.saveOrUpdate(AbstractEntityDao.java:190)
    at com.factorlab.persistence.AbstractEntityDao.saveOrUpdate(AbstractEntityDao.java:177)
    at com.factorlab.persistence.AbstractEntityDao.saveOrUpdate(AbstractEntityDao.java:38)
    at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:196)
    at $Proxy72.saveOrUpdate(Unknown Source)
    at com.factorlab.observations.sales.OpportunityScoreUpdateServiceImpl.receiveOpportunityEvent(OpportunityScoreUpdateServiceImpl.java:83)
    at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy76.receiveOpportunityEvent(Unknown Source)
    at sun.reflect.GeneratedMethodAccessor102.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:69)
    at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:84)
    at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)
    at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
    at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:102)
    at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:126)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:227)
    at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:127)
    at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:73)
    ... 49 more

真正奇怪的部分(就我而言)是我成功登录(或者至少表明我在收到错误之前已经通过了身份验证:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.REPEATABLE_READ)
@Trace(dispatcher = true)
public void receiveOpportunityEvent(EntityEvent<Opportunity> event) {
    sessionFactory.getCurrentSession().refresh(event.getEntity());
    log.info("OpportunityScoreUpdateService receiveOpportunityEvent: " + event);

    //
    //
    // Here we see that we are either authenticated or we log in successfully
    //
    //
    if (!securityUtils.getSubject().isAuthenticated()) {
        try {
            securityUtils.getFactorlabSubject().login(new ActAsAuthenticationToken(event.getEventUsername()));
        } catch (RuntimeException e) {
            log.error("Could not log in user " + event.getEventUsername() + ": " + e.getMessage(), e);
            return;
        }
    }
    if (event.getEntity() instanceof ObservedOpportunity) {
        ObservedOpportunity opportunity = (ObservedOpportunity) event.getEntity();
        opportunity = (ObservedOpportunity) opportunityDao.getById(opportunity.getId(), SkippedCheck.PERMISSION, SkippedCheck.DELETED);
        if (!opportunity.isDeleted()) {
            List<Stage> stages = stageDao.getAllByZone(opportunity.getZone(), SkippedCheck.PERMISSION);
            Map<Stage, Double> originalScoresByStage = new HashMap<Stage, Double>();
            Map<Stage, Double> newScoresByStage = new HashMap<Stage, Double>();
            final Double originalTotal = opportunity.getTotalScore();
            for (Stage stage : stages) {
                originalScoresByStage.put(stage, opportunity.getScoreByStage(stage));
                double score = calculator.getScoreForOpportunityAndStage(opportunity, stage);
                opportunity.setScoreByStage(stage, score);
                newScoresByStage.put(stage, opportunity.getScoreByStage(stage));
            }

            final double newTotalScore = calculator.getTotalScoreForOpportunity(opportunity);
            opportunity.setTheTotalScore(newTotalScore);
            final boolean scoreChanged = originalTotal == null ||
                    Math.round(originalTotal) != Math.round(newTotalScore) ||
                    checkStageScoresChanged(originalScoresByStage, newScoresByStage);
            if (scoreChanged) {
                opportunity.setScoreCalculated(new Date());

                //
                //
                // Here is where we get the exception
                //
                //
                opportunityDao.saveOrUpdate(opportunity, SkippedCheck.PERMISSION);
            } else {
                opportunityDao.refresh(opportunity);
            }
        }
    }
}

什么可能导致此异常?


我收到此错误并发现在调用之前完全销毁任何现有会话subject.login(credentials)修复。

// Login the user
private Subject loginUser()
{
  ensureUserIsLoggedOut();
  Subject subject = SecurityUtils.getSubject();
  subject.login(credentials);
}

支持的例程是:

// Logout the user fully before continuing.
private void ensureUserIsLoggedOut()
{
    try
    {
        // Get the user if one is logged in.
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser == null)
            return;

        // Log the user out and kill their session if possible.
        currentUser.logout();
        Session session = currentUser.getSession(false);
        if (session == null)
            return;

        session.stop();
    }
    catch (Exception e)
    {
        // Ignore all errors, as we're trying to silently 
        // log the user out.
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shiro 向 DefaultSecurityManager 抱怨“没有 id xxx 的会话” 的相关文章

  • 为什么浏览器允许onmousedown JS改变href?

    我很长时间以来都注意到 当您尝试复制链接位置或在 Facebook 上打开链接时 它会修改链接并将其传递给l php 例如 我可以被发送到 http www facebook com l php u http 3A 2F 2Fwww goo
  • PHP - 将数据从一个站点安全地传递到另一个站点

    我有一个可以接受来自多个站点的请求的站点 有点像升级检查 这些网站将发送用户名 密码 应用程序版本等信息 然后我的网站将根据这些信息发送响应 基本上这是一个 GET请求 例如 http www mysite com user boo pas
  • Google App Engine 的 JDO:转义引号

    如何转义 JDO Google App Engine 中的查询参数 例如 如果变量名称可能包含单引号 形式的不安全字符 如何使下一个片段安全 PersistenceManager pm String query select from Pe
  • 如何使用苹果钥匙串?

    我正在尝试使用scifihifi iphone 来自 Github http github com ldandersen scifihifi iphone tree master security存储和检索用户名和密码 但是 当我添加课程时
  • 什么是“代码替换(OAuth 登录)”威胁?

    来自OAuth 2 0 威胁模型和安全注意事项 draft https datatracker ietf org doc html draft ietf oauth v2 threatmodel 08 section 4 4 1 13 4
  • 合并 2 个 .jks 信任库文件

    我正在使用启用了 SSL 的 Tomcat 并使用信任库进行客户端身份验证 我有两个 jks trustore 文件 第一个 我将其用于 PROD 环境 另一个用于 TEST 环境客户端证书 我在 Tomcat 上部署了 Web 应用程序
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • 64 位上的 ASLR 和内存布局:是否仅限于规范部分 (128 TiB)?

    当加载启用 ASLR 的 PIE 可执行文件时 Linux 是否会限制程序段到规范部分 最多 0000 7fff ffff ffff 的映射 还是会使用完整的较低部分 起始位 0 显然 Linux 不会给你的进程提供不可用的地址 这会导致它
  • 当 .NET 项目开源时,谁应该拥有用于签署 .NET 程序集的私钥? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 更具体地说 是一个类库程序集 我最初的想法 让一些指定的管理员进行所有程序集签名 但是 当错误修复和新版本被编写时 二进制文件最终将依赖于它们的
  • 是否可以执行扩展名为 file.php.jpg 的 PHP?

    网站合法文件image upload php用于上传文件89471928047 php jpg这是简单的文件上传表单 将 tmp 文件复制到同一图像文件夹 他们如何设法执行它并通过它上传其他文件 有人知道这怎么可能吗 PHP version
  • CAS(代码访问安全)的目的是什么?

    我参与过很多 Web 应用程序 但从未使用过 CAS 也许也从未觉得有必要使用它 什么时候需要使用CAS 人们真的在他们的应用程序中使用它吗 CAS 实际上只在桌面应用程序中有用 可以这么说 在桌面应用程序中 您想要限制通过网络 例如 运行
  • 如何调用 LogonUser() 来获取启用了 UAC 的 Windows 服务中的非限制完整令牌?

    我正在 Windows Server 2012 上运行 WindowsService 它需要模拟域管理员用户 该用户也被添加到计算机上的本地管理员组 系统上启用了 UAC 并且使用 LogonType 为 LOGON32 LOGON INT
  • Ruby 的 OpenSSL::Random 种子是否足够?

    我对 Ruby 知之甚少 所以如果答案很明显 请原谅我 我注意到在http www ruby doc org stdlib 1 9 3 libdoc securerandom rdoc SecureRandom html http www
  • 正确使用 EncryptedSharedPreferences

    Android 最近发布了 EncryptedSharedPreferences 它自动加密 SharedPreferences 键 值数据 虽然这很好 但我发现我可以简单地连接 API 调用并检索解密的值 除了在调用 EncryptedS
  • python:PyPi公共模块:如何确定是否安全?

    我已经完成了我的 python 3 应用程序 它正在使用 PyPi 的多个公共模块 然而 在我将其部署到我公司的企业 将处理客户的凭据并访问第 3 方 API 之前 我需要尽职调查确保它们既安全又安全 我必须执行哪些步骤 验证 PyPi 模
  • 使用鼠标检测的反验证码

    我想知道是否可以为仅使用 javascript 的表单创建一个安全的人体检测机制 不使用验证码 来检测鼠标移动 因为 jquery 或操作系统代码都可以移动鼠标 我是这么告诉的 这是我的计划 使用 jQuery 我可以检测鼠标是否已移动 然
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • 评估 CRC-32 实现中的差异

    我见过相同基本 CRC 32 算法的许多不同实现 如下所示 int remain int sbox SIZESBOX int dividend int bit for dividend 0 dividend lt SIZESBOX divi
  • 在没有默认 java.policy 文件的情况下运行 Java 安全管理器

    我不想修改 java 主目录中的任何内容 但是 我担心有时我的默认 java policy 文件可能过于宽松 当我使用以下命令运行 java 时 有没有办法使用指定的策略文件作为唯一的策略文件 Djava security manager

随机推荐

  • AFrame:重新调整元素的父级,保持其世界位置、旋转

    我正在尝试重新设置元素 实体 的父级 保持其在场景中的位置 旋转 以及如果可能的话 大小 例如比例 理想情况下 我希望有一个组件 例如 reparent 当在实体上设置时 将其 移动 到指定的父级 从而将实体的外观保留在场景中 例如 对于下
  • 如何在 MATLAB 中创建循环缓冲区,以便以正确的顺序进行连续测量

    我读到 如何在 MATLAB 中创建缓冲矩阵以进行连续测量 http stackoverflow com questions 821637 how to create a buffer matrix in matlab for contin
  • 更改 Rails 版本

    我不小心将 Rails 版本更改为 4 0 0 我尝试过 gem uninstall Rails version 4 0 0 rc1 并安装版本 3 2 13 但当rails v 时它仍然是版本 4 0 0 然后我尝试了 gem unins
  • Java电子邮件内容为空

    我有一些代码片段 我可以在其中发送带有 Excel 文件附件的电子邮件 一切正常 我可以看到标题 甚至文件附件 唯一没有出现的是电子邮件内容 我已经测试过我的 emailContent 变量不为空 我还能做些什么来让它出现 我什至启用了这行
  • 使用 AJAX 和 PHP 上传多个文件

    我正在尝试使用 ajax 和 php 上传多个文件 JavaScript和Ajax代码如下 document on click UploadButton function e var form new FormData var files
  • 带有可选index.php的动态RewriteBase

    我的动态基本 URL 位于 us ca and fr ca 如上所述使用建议的 RewriteCondhere https stackoverflow com a 25626489 1812580 在大多数情况下我都能做到这一点 它起作用的
  • 为什么当分配移动值的成员时编译不会失败?

    我正在研究以下示例Rust 实例 http rustbyexample com derive Debug struct Point x f64 y f64 derive Debug struct Rectangle p1 Point p2
  • Rails/postgres,“外键”存储在数组中以创建一对多关联

    postgres 数组可以用于在 Rails 中创建一对多 has many 关联 4 吗 我知道外键类型数组是不可能的 示例 一项任务有多个受让人 传统上我会使用关联表来解决这个问题 任务 gt 受让人 gt 用户 使用数组 这不是必需的
  • Swift - 检索子视图

    在我的应用程序中 我向视图添加标签 然后在单击按钮时尝试从视图中清除特定标签 并在尝试检索子视图时遇到错误 class FirstViewController UIViewController IBAction func btnAddTas
  • CORS 预检请求返回“403 Forbidden”;后续请求仅在 Chrome 中发送

    使用 pluploader 失败后这个问题 https stackoverflow com questions 16144879 plupload runtimes returning 403 forbidden error when tr
  • 分配 int 指针值的简单方法? [复制]

    这个问题在这里已经有答案了 Given a struct看起来像 type foo struct i int 如果我想设置i到1 我必须 throwAway 1 instance foo i throwAway 有没有什么方法可以在一行中完
  • 通过 iTunes Connect 创建的所有沙盒测试人员都请求“需要付款信息”

    我最近遇到了一个问题 以前我在使用 iOS 沙箱测试器和应用内购买时似乎没有遇到过这个问题 我做了以下事情 创建一个以前未使用过的新沙箱测试器 分配给美国 注销设备上的所有 iTunes 帐户 打开应用程序并完成应用内购买流程 通过新的 i
  • 如何让我的帮助按钮显示 matlab 帮助?

    Hye Guyz 如果我想为我的人物制作一个帮助按钮 如果用户按下帮助按钮 我该如何制作 它会出现matlab助手 例如产品帮助 功能浏览器等 我如何链接它 有没有关于制作帮助按钮的教程 您可以设置Callback按钮的属性 doc plo
  • 在单个构建文件中使用带有 Traceur 的 ES6 模块

    我只是有一个简单的问题无法在任何地方找到 整个早上都在谷歌上搜索 关于 Traceur 的信息不多 而且什么时候有也不是很清楚 至少对我来说是这样 当我使用traceur转译单个输出文件并在浏览器中使用traceur runtime使用它时
  • Maven SonarQube 多模块

    我有一个由多个模块组成的项目 我正在尝试使用 SonarQube 来分析这些 我已将 Sonar Maven 插件作为依赖项包含在每个模块中
  • 操作栏中的后退箭头 Sherlock 未显示

    在我的项目中 我使用了操作栏 sherlock 库 我想在操作栏中制作后退按钮我使用了以下代码 getSupportActionBar setHomeButtonEnabled true And Override public boolea
  • Azure存储get_blob_to_stream无法将保存的csv文件下载为流

    我想将存储在Azure存储中的CSV文件下载到流中并直接在我的python脚本中使用 但是在Thomas的帮助下完成此操作后 我无法使用pandas read csv方法 错误消息是 pandas io common EmptyDataEr
  • 通过主管关闭 Docker 容器

    我无法关闭由主管通过以下方式启动的 Docker 容器supervisorctl stop all 就算是supervisorctl status显示容器已关闭 docker ps and ps表明它们实际上仍在运行 查阅有关行动的主管文件
  • 如何在Spring + JSP中创建超链接

    在 Spring JSP 中创建超链接的正确方法是什么 一定有比仅仅在代码中编码更好的方法 a href 标签 以显示人员的页面为例 网址是people htm 相应的控制器从数据库中获取人员并执行可选的列排序 JSP 可能如下所示 tab
  • Shiro 向 DefaultSecurityManager 抱怨“没有 id xxx 的会话”

    我在一个长期运行的应用程序中使用 Apache Shiro 1 2 0 该应用程序从队列中读取消息并采取操作 所采取的操作需要 Shiro 进行身份验证的会话 因此我实现了一个 ActAsAuthenticationToken 和自定义凭据