我正在使用 Shiro Security 来保护 JSF 项目。
它按预期工作,包括调用远程 EJB(不安全)。然而,当调用不安全的 EJB 时,我有以下警告,但该方法执行没有问题:
IIOP1002: Principal propagation: Cannot find principal information in subject
这到底是什么意思?我应该怎么做才能解决这个问题?我需要从安全应用程序在远程 EJB 中执行该方法,并且每次调用 EJB 时都会将此警告转储到日志中(多次发生)。
编辑:
当我将项目部署在与 EJB 相同的 Glassfish 服务器中时,不会出现警告。
编辑2:
我考虑过在调用 EJB 之前在 InitialContext 中插入主要信息,如下所示:
Hashtable env = new Hashtable();
env.put(Context.SECURITY_PRINCIPAL, SecurityUtils.getSubject().getPrincipal());
ctx = new InitialContext(env);
还是没有运气。
SecurityUtils 来自
org.apache.shiro.SecurityUtils
库。
Apache Shiro 是一个应用层安全解决方案。据我所知,它没有以任何方式与您的应用程序服务器集成。
Java EE 服务器通常期望负责身份验证、授权等。因此,它可以在进行本地和远程 EJB 调用时正确传播凭证。这就是 javax.annotation.security.RolesAllowed 等功能的实现方式。
Shiro 将其委托人传播到 javax.security.Principal,这是远程 EJB 无法理解的。必须取消 Java 主体。 这是在 Shiro EE 集成模块 中完成的,它将集成到 Shiro 2.0+ 版本中