JBOSS EAP 7-EJB客户端用户数据
我已经将EJB应用程序从jboss 5.0.1迁移到jboss EAP 7 我想将用户数据从EJB客户端传递到我的EJB 我使用此代码将自定义属性传递给ejb服务器,但它不再工作 客户:JBOSS EAP 7-EJB客户端用户数据,jboss,wildfly,jboss-eap-7,Jboss,Wildfly,Jboss Eap 7,我已经将EJB应用程序从jboss 5.0.1迁移到jboss EAP 7 我想将用户数据从EJB客户端传递到我的EJB 我使用此代码将自定义属性传递给ejb服务器,但它不再工作 客户: public class CustomData extends SimplePrincipal{ String userData1; public CustomData(String userData1){ this.userData1 = userData1; } SecurityClient client
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();
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");
服务器:
@Resource
SessionContext ejbCtx;
Principal data= ejbCtx.getCallerPrincipal();
data.getName() --- anonymous
如何在新JBOSS上修复它 1.创建客户端拦截器 此拦截器必须实现org.jboss.ejb.client.ejbclienterceptor。拦截器将通过上下文数据映射传递额外的安全令牌,该映射可以通过调用EJBClientInvocationContext.getContextData获得 2.创建并配置服务器端容器拦截器 容器拦截器类是简单的普通旧Java对象POJO。它们使用@javax.annotation.AroundInvoke来标记bean调用期间调用的方法 a、 创建容器拦截器 此拦截器从上下文检索安全身份验证令牌,并将其传递给JAAS Java身份验证和授权服务域进行验证 b。配置容器拦截器 3.创建JAAS登录模块 此自定义模块使用现有的已验证连接信息加上任何其他安全令牌执行验证 将自定义LoginModule添加到链中 必须将新的自定义LoginModule添加到链的正确位置,以便以正确的顺序调用它。在本例中,SASLPLUSLOGINMODEL必须在加载设置了密码堆叠选项的角色的LOGINMODEL之前链接 a、 使用管理CLI配置LoginModule订单 以下是管理CLI命令的示例,这些命令在设置密码堆叠选项的RealmDirect LoginModule之前链接自定义SASLPLUSLOGINMODEL b。手动配置LoginModule顺序 以下是在服务器配置文件的安全子系统中配置LoginModule顺序的XML示例。自定义SaslPlusLoginModule必须位于RealmDirect LoginModule之前,以便它可以在加载用户角色和设置密码堆叠选项之前验证远程用户 创建远程客户端 在下面的代码示例中,假设JAAS LoginModule访问附加的-secret.properties文件 请参阅链接:
我这样做: 客户:
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();
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"?>
我会将客户端更改为使用提供登录详细信息的标准方式,然后使用您自己的登录模块在服务器端定义适当的自定义安全域和领域