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 的会话” 的相关文章

  • 有没有办法使用 Paramiko 和 Python 来获取您连接的 SSH 服务器的横幅?

    有没有办法使用 Paramiko 和 Python 来获取您尝试连接的 SSH 服务器的横幅 我正在处理许多机器的超安全服务器设置过程 密码是通过预定义的密钥生成的 该密钥与 SSH 横幅一起打印出来 我可以访问将为我提供密码的实用程序 但
  • 使用 Passport-facebook 的 Facebook OAuth 安全性

    我目前正在使用客户端 React 组件让用户通过我的应用程序中的 OAuth 登录 Facebook 在服务器端 我使用 npm 包护照 Facebook 令牌 https github com drudge passport facebo
  • 如何在 servicestack.net 中实现身份验证

    我正在调查 servicestack net 但它的示例和文章似乎没有涵盖身份验证 这是由 servicestack net 处理的东西 如果是的话如何处理 我特别有兴趣实现对以下方面的支持 OAuth 因此能够检查原始请求并验证它 检索关
  • 如何向所有用户授予团队项目访问权限?

    在我们的组织中 我们有一些项目 根据政策 向所有有权访问 TFS 的开发人员 QA 和项目经理开放 在包含超过 150 个团队项目和 500 多个有效用户的团队项目集合中 我们如何轻松地将所有有效 TFS 用户添加到某个特定项目的 读者 组
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 上传文件最安全的方法是什么?

    我工作的公司最近在我们托管的网站上遭受了许多标头注入和文件上传漏洞攻击 虽然我们已经解决了标头注入攻击的问题 但我们尚未控制上传漏洞 我正在尝试设置一系列即插即用类型的上传脚本以供内部使用 设计人员可以将其复制到其网站的结构中 修改一些变量
  • Spring Security 3.1 - 当会话超时时自动重定向到登录页面

    我有一个基于 Spring 的 Web 应用程序 并且正在实现 Spring Security 3 1 我需要的是当配置的会话超时发生时能够自动重定向到登录页面 我正在实现包含大量 jQuery 功能的网页 因此我需要能够自动重定向 目前发
  • 授予对视图的 SELECT 权限,但不授予对基础对象的 SELECT 权限

    我经常读到 视图的目的之一是安全性 允许某些用户访问基础表 而其他用户仅访问派生视图 考虑到这一点 我设计了几个向外部用户提供受限数据集的视图 一切都很好 但在实践中这是行不通的 我授予后SELECT对视图的权限 除非我授予 否则用户无法访
  • Linux 缓冲区溢出环境变量

    我一直在审查不同类型的缓冲区溢出 并遇到了一个我不记得为什么会发生的问题 下面的代码是我尝试执行缓冲区溢出的程序 include
  • 尝试利用?

    我看到我的 nopCommerce 网站记录了以下搜索 ADw script AD4 alert 202 ADw script AD4 我有点好奇他们想要完成什么 我搜索了一下 似乎是ADw script AD4 以 UTF7 编码为
  • 良好的安全实践和自动身份范围管理是否相互排斥?

    我正在尝试使用自动身份范围管理 http msdn microsoft com en us library ms152543 aspx sectionToggle1 但是 确保我的用户可以在具有标识列的表中插入记录的唯一方法是使它们db o
  • 使用openssl从服务器获取证书

    我正在尝试获取远程服务器的证书 然后可以将其添加到我的密钥库中并在我的 Java 应用程序中使用 一位高级开发人员 正在度假 告诉我我可以运行这个 openssl s client connect host host 9999 获取转储的原
  • 通过访问硬盘序列号来保护软件[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想获得VB NET或VB代码来在启
  • 具有桌面应用程序安全性的 OAuth2

    我有一个 Electron 应用程序 它基本上是一个 Google Drive 客户端 我打算使用 OAuth 2 但是 Google API 要求我在生成 client secret 的地方注册我的应用程序 由于这是一个桌面应用程序 因此
  • .net 4.5.1 ASP.NET MVC 5 中的用户锁定

    因此 在新的 Net Framework 4 5 1 AspNetUser 表中没有用于在有限次数的不成功尝试后将用户锁定的列 是否有为此目的构建的框架或解决方案来取代以前的 net 框架中曾经存在的功能 还是我必须自己构建 在即将发布的
  • 信任所有将文件发送到 https Web 服务的 java 类

    我需要编写自己的类来告诉 mule 与服务 wsdl 的 https 连接已验证 我的 mule 项目已经接近完成 但最后一块丢失了 在特定的 url 发送文件 我想要实现的目标 建立连接并将 xml 发送到目标 url 读取 xml 格式
  • 配置 shiro.ini 以进行 JDBC 连接

    作为我新的一年学习新技术计划的一部分 我开始尝试使用 Apache Shiro 安全框架 我设法让基本示例正常工作 该示例将用户名 密码和角色存储在 shiro ini 文件中 但是当我修改 shiro ini 文件以使用 JDBC 时 它
  • 加密成本高,解密成本低

    我希望该用户 攻击者加密数据并发送给服务器 现在我想要一种与标准算法完全相反的算法 使用快 难以解密 即很难使用服务器发送的密钥来加密密码等数据 以防止随机攻击 但很容易解密这样服务器在验证用户时消耗的时间非常少 但是对于攻击者来说 每次使
  • 在 Spring Security SAML 身份验证请求中配置 POST ProtocolBinding

    Spring Security SAML 坚持在 SAML 身份验证请求中请求 Artifact 绑定 ProtocolBinding 属性
  • openssl_crypt 中初始化向量的使用

    我看了一下this https stackoverflow com questions 1391132 two way encryption in php问题 并想为自己做 当我运行这段代码时 直接取自这个答案 https stackove

随机推荐

  • 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 和自定义凭据