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

时间:2017-01-18 07:19:38

标签: 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 = SecurityClientFactory.getSecurityClient();
    client.setSimple(new CustomData("MyData"), credentials.getPass());
    client.login();

服务器:

 @Resource 
 SessionContext ejbCtx;

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

如何在新的JBOSS上修复它?

2 个答案:

答案 0 :(得分:1)

1.创建客户端拦截器

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

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

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

a。创建容器拦截器

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

湾配置容器拦截器

3.创建JAAS LoginModule

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

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

    a。使用管理CLI配置LoginModule订单

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

    湾手动配置LoginModule订单

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

    1. 创建远程客户端
    2. 在下面的代码示例中,假设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

答案 1 :(得分: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>