代码之家  ›  专栏  ›  技术社区  ›  David Waters

控制EJB调用上传递的安全原则

  •  0
  • David Waters  · 技术社区  · 15 年前

    我正在研究一个现有的大型EJB1.1应用程序,该应用程序当前具有自己的安全性,并且没有由EJB1.1管理的安全性。

    我正试图以小步骤转移到一个更标准的解决方案,因此我想开始控制传递给EJB的安全原则。我不能更改当前的登录或安全框架,所以我不相信我现在可以迁移到JAAS。

    一旦我创建了java.security.Principle,我应该把它存储在哪里,这样它就可以从context.getCallerPrincipal()中传递到我的ejb调用方并可用?

    谢谢。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Arjan Tijms Mike Van    11 年前

    Java EE的安全性有点一无是处。您应该使用Java EE身份验证机制来正确设置安全上下文。如你所见 EJBContext 您可以通过注入获得的是只读的。

    我知道更改安全上下文的唯一标准方法是使用 @RunAs (见 an example ),但它非常不灵活。不能动态传递凭据。

    有一些不可移动的容器特定机制,例如Glassfish ProgrammaticLogin . 但即使在这种情况下,您需要传递用户名/密码,也不能只更改 Principal 在飞行中。

        2
  •  1
  •   Alex Theedom    6 年前

    新的 Security API in Java EE 8 提供一致的安全方法。这个 SecurityContext 抽象跨越了Servlet和EJB容器,并提供返回用户主体的方法。

    在Java EE 5/6/7中,servlet和EJB容器不一致地实现安全上下文对象。例如,servlet容器提供 HttpServletRequest 在其上 getUserPrincipal() 方法来获取用户 Principal ,并且EJB容器提供不同的名称 EJBContext 实例,在其上调用相同名称的方法。同样,要测试用户是否属于某个角色,方法 isUserRole() 是在 实例和 isCallerInRole() 是在 EJBContext 实例。

    这个 在Servlet和EJB容器之间提供一致性,以获取此类信息。