2017-01-18 62 views
0

我已经迁移从JBoss的5.0.1我的EJB应用程序到JBoss EAP 7JBOSS EAP 7 - EJB客户端的用户数据

我想从EJB客户端的用户数据传递给我的EJB。

我正在使用此代码将自定义属性传递给ejb服务器,但它不再工作。

客户:

public class CustomData extends SimplePrincipal{ 
String userData1; 
public CustomData(String userData1){ 
this.userData1 = userData1; 
} 
SecurityClient client = SecurityClientFactory.getSecurityClient(); 
    client.setSimple(new CustomData("MyData"), credentials.getPass()); 
    client.login(); 

服务器:

@Resource 
SessionContext ejbCtx; 

Principal data= ejbCtx.getCallerPrincipal(); 
data.getName() --- anonymous 

如何解决此问题的新JBOSS?

+0

我会改变客户端使用提供登录信息的标准方式,然后使用您自己的登录模块在服务器端定义合适的自定义安全域和领域 –

回答

0

我有这样做的话:

客户:

Properties properties = new Properties(); 
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
properties.put("org.jboss.ejb.client.scoped.context", "true"); 
properties.put("remote.connection.default.username", "MyData"); 

服务器:

public class MyContainerInterceptor{ 
@AroundInvoke 
public Object intercept(InvocationContext ctx) throws Exception { 

    Connection connection = RemotingContext.getConnection(); 

    if (connection != null) { 
     for (Principal p : connection.getPrincipals()) { 
     if (p instanceof UserPrincipal) { 
       if (p.getName() != null && !p.getName().startsWith("$")) 
        System.out.println(p.getName()); //MyData will be printed 
      } 
     } 

    } 

    return ctx.proceed(); 
} 

}

不要忘记配置容器拦截在JBoss中,ejb3.xml(未在ejb-jar.xml)

<?xml version="1.0" encoding="UTF-8"?> 

<jee:assembly-descriptor> 
    <ci:container-interceptors> 
     <jee:interceptor-binding> 
      <ejb-name>*</ejb-name> 
      <interceptor-class>package...MyContainerInterceptor</interceptor-class> 
     </jee:interceptor-binding> 
    </ci:container-interceptors> 
</jee:assembly-descriptor> 

1

1,创建客户端拦截

这个拦截器必须实现org.jboss.ejb.client.EJBClientInterceptor。期望拦截器通过上下文数据映射传递额外的安全性令牌,该映射可以通过调用EJBClientInvocationContext.getContextData()来获得。

2.创建和配置服务器端容器拦截

集装箱拦截器类是简单的普通Java对象(PO​​JO)。他们使用@ javax.annotation.AroundInvoke标记调用bean期间调用的方法。

a.Create容器拦截

这个拦截从上下文中检索安全认证令牌,并将其传递到JAAS(Java认证和授权服务)域为验证

湾配置容器拦截

3.创建将JAAS LoginModule

这种定制模块执行使用现有的认证的连接信息加上任何附加的安全性令牌的认证。

  • 添加自定义登录模块连锁
  • ,使其以正确的顺序调用您必须将新的自定义LoginModule添加到正确的位置链条。在此示例中,SaslPlusLoginModule必须在加载具有密码堆栈选项集的角色的LoginModule之前链接。

    a.Configure使用Management CLI

    以下是管理CLI的示例LoginModule的订单命令,链RealmDirect的LoginModule,设置密码堆叠选项之前定制SaslPlusLoginModule。

    b。手动配置LoginModule订单

    以下是在服务器配置文件的安全子系统中配置LoginModule顺序的XML示例。自定义SaslPlusLoginModule必须位于RealmDirect LoginModule之前,以便它可以在用户角色加载并设置密码堆栈选项之前验证远程用户。

  • 创建远程客户端
  • 在下面的代码示例中,假定通过将JAAS LoginModule

    访问的additional-secret.properties作品显示的链接: https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.2/html/Development_Guide/Pass_Additional_Security_For_EJB_Authentication.html