1

我在 WebLogic 12c 中部署了一个包含 EJB 的 WAR。我发现我可以从独立客户端访问 EJB,而无需在 InitialContext 中指定用户名/密码。有没有办法防止匿名访问 WAR 中的所有 EJB?

令我困惑的是,我需要提供正确的用户名/密码来进行身份验证(错误的密码将无法通过身份验证)。但是我可以省略用户名/密码(在我的 InitialContext 属性中),它可以让我访问 EJB。

因此,我希望配置 Weblogic,使其始终需要用户名/密码才能访问任何 EJB。如果我省略了用户名/密码,它就不应该让我访问我的 EJB。

我正在寻找对这种安全性的容器支持,而不是尝试自己实现一些东西。

4

1 回答 1

0

您可以定义一个默认拦截器并在那里进行一些角色检查。

拦截器将是这样的:

public class LoginCheckInterceptor {
  @Resource
  private EJBContext ejbContext;

  @AroundInvoke
  public Object checkLogin(final InvocationContext context) throws Exception {
    if (userAuthenticated()) {
      return context.proceed();
    } else {
      throw new SecurityException("User not authorized");        
    }
  }

  private boolean userAuthenticated() {
    // do role checking as needed
    // use this.ejbContext.isCallerInRole(...)
    // or this.ejbContext.getCallerPrincipal()
  }
}

要使其作为默认拦截器工作(适用于所有 EJB),请自定义部署描述符ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
  <interceptors>
    <interceptor>
      <interceptor-class>your.package.LoginCheckInterceptor</interceptor-class>
    </interceptor>
  </interceptors>
  <assembly-descriptor>
    <interceptor-binding>
      <ejb-name>*</ejb-name>
      <interceptor-class>your.package.LoginCheckInterceptor</interceptor-class>
    </interceptor-binding>
  </assembly-descriptor>
</ejb-jar>
于 2013-10-20T08:13:21.957 回答