0

我已将我的 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 上修复它?

4

2 回答 2

1

1.创建客户端拦截器

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

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

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

a.创建容器拦截器

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

湾。配置容器拦截器

3.创建JAAS登录模块

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

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

您必须将新的自定义 LoginModule 添加到链的正确位置,以便以正确的顺序调用它。在此示例中,SaslPlusLoginModule 必须链接在 LoginModule 之前,该模块加载带有密码堆栈选项集的角色。

a. 使用管理 CLI 配置 LoginModule 顺序

以下是管理 CLI 命令的示例,该命令将自定义 SaslPlusLoginModule 链接到设置密码堆栈选项的 RealmDirect LoginModule 之前。

湾。手动配置 LoginModule 顺序

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

  1. 创建远程客户端

在下面的代码示例中,假设 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

于 2017-01-21T14:30:13.563 回答
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>

于 2017-01-23T06:52:58.107 回答