当调用org.apache.shiro.realm.AuthorizingRealm中的doGetAuthorizationInfo(PrincipalCollection主体)时,传递的UsernamePasswordToken是另一个用户的。
下面的描述解释了我的目标:
获取List user1 获取List user1-role 用户user1的角色是user1-role .. 用户user1的权限是iswapi:service1:,iswapi:service2:..
这些是来自AuthorizingRealm的自定义实现的打印输出。 基本上,我得到了校长:
String user =(String)getAvailablePrincipal(principalals);
我获取该用户的角色(打印出>>>获取List .....行)。令人惊讶的是,正在打印的用户是user1,而实际上进行呼叫的用户是user2。
问题是,为什么getAvailablePrincipal(principalals)返回user1而不是user2?是否正确致电了解该上下文的当前所有者/用户?我相信getAvailablePrincipal(principalals)应该在SHIRO_SECURITY_TOKEN标题中返回用户,但这不会发生。
经过一些研究/调试后,我意识到Shiro通过
获取当前线程的用户主题currentUser = SecurityUtils.getSubject();
然而,问题在于驼峰OSGi,线程总是被重用,因此重新使用的线程中的新请求将始终拥有第一个线程的用户。
我发现打印出运行Realm的线程,我发现它有一个线程ID和线程名称user1。因此,将始终为user2提取user1的角色。
如果我的假设是正确的,我该如何确保新请求的新线程?
注意: 我的camel bundle使用direct:vm组件,我认为它使用源/源端点的线程。当我打印出线程ID&将它命名为:
主题ID:5944 主题名称:qtp406786712-5944 线程组名称:spring-osgi-extender [1db479f4] -threads 线程组父名称:org.springframework.osgi.extender-1.2.1