JBOSS EAP 7 - EJB 客户端用户数据

JBOSS EAP 7 - EJB Client user data

我已将我的 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 = SecurityClientFactory.getSecurityClient();
    client.setSimple(new CustomData("MyData"), credentials.getPass());
    client.login();

服务器:

 @Resource 
 SessionContext ejbCtx;

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

如何在新 JBOSS 上修复它?

1.Create客户端拦截器

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

获得

2.Create并配置服务端容器拦截器

容器拦截器 类 是简单的普通旧 Java 对象 (POJO)。他们使用 @javax.annotation.AroundInvoke 来标记在调用 bean 期间调用的方法。

a.Create容器拦截器

此拦截器从上下文中检索安全身份验证令牌并将其传递给 JAAS(Java 身份验证和授权服务)域进行验证

b。配置容器拦截器

3.Create JAAS 登录模块

此自定义模块使用现有的经过身份验证的连接信息加上任何其他安全令牌来执行身份验证。

  1. 将自定义 LoginModule 添加到链中

您必须将新的自定义 LoginModule 添加到链的正确位置,以便以正确的顺序调用它。在此示例中,SaslPlusLoginModule 必须链接在 LoginModule 之前,该 LoginModule 使用 password-stacking 选项集加载角色。

a.Configure 使用管理 CLI 的 LoginModule 命令

以下是管理 CLI 命令的示例,它在设置 password-stacking 选项的 RealmDirect LoginModule 之前链接自定义 SaslPlusLoginModule。

b。手动配置 LoginModule 顺序

下面是XML在服务器配置文件的安全子系统中配置LoginModule顺序的例子。自定义 SaslPlusLoginModule 必须在 RealmDirect LoginModule 之前,以便它可以在加载用户角色和设置 password-stacking 选项之前验证远程用户。

  1. 创建远程客户端

在下面的代码示例中,假设 additional-secret.properties 文件由 JAAS LoginModule

访问

参见 link: https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/6.2/html/Development_Guide/Pass_Additional_Security_For_EJB_Authentication.html

我已经用这种方法完成了:

客户:

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>