1

当调用 org.apache.shiro.realm.AuthorizingRealm 中的 doGetAuthorizationInfo(PrincipalCollection principals) 时,会出现传递的 UsernamePasswordToken 是另一个用户的。

下面的跟踪解释了我的意思:

获取列表 user1 获取用户 user1 的列表 user1-role 角色是/是 user1-role.. 用户 user1 的权限是/是 iswapi:service1:, iswapi:service2:..

这些是 AuthorizingRealm 的自定义实现的打印输出。基本上,我得到了校长:

String user = (String) getAvailablePrincipal(principals);

然后我获取该用户的角色(打印出 >>> fetching List ..... 行)。令人惊讶的是,被打印的用户是 user1,而实际上拨打电话的用户是 user2。

问题是,为什么 getAvailablePrincipal(principals) 返回 user1 而不是 user2?这是了解该上下文的当前所有者/用户的正确调用吗?我相信 getAvailablePrincipal(principals) 应该在 SHIRO_SECURITY_TOKEN 标头中返回用户,但这没有发生。

经过一些研究/调试,我意识到 Shiro 通过做

主题 currentUser = SecurityUtils.getSubject();

但是,问题在于骆驼 OSGi,线程总是被重用,因此来自重用线程的新请求将始终拥有第一个线程的用户。

这我发现打印出运行 Realm 的线程,我发现它有一个线程 id 和 user1 的线程名称。因此,将始终为 user2 获取 user1 的角色。

如果我的假设是正确的,我该如何确保新请求的新线程?

注意:我的骆驼包使用 direct:vm 组件,我认为它使用了源/原始端点的线程。当我打印出线程 ID 和名称时,它看起来像:

线程 ID:5944 线程名称:qtp406786712-5944 线程组名称:spring-osgi-extender[1db479f4]-threads 线程组父名称:org.springframework.osgi.extender-1.2.1

4

0 回答 0