Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java rmi ejb调用中可重用登录会话的概念_Java_Security_Jboss_Ejb 3.0 - Fatal编程技术网

Java rmi ejb调用中可重用登录会话的概念

Java rmi ejb调用中可重用登录会话的概念,java,security,jboss,ejb-3.0,Java,Security,Jboss,Ejb 3.0,这不是一个简单的问题,因为我正在重新思考通过登录和安全性来保护EJB3.0服务的体系结构 我们在JBoss5.1上有一个EJB3.0应用程序,它为SWT客户机提供各种读写数据的服务。要使用服务,客户端必须使用有效的用户和密码登录,该用户和密码由SpringSecurity在LDAP服务器中查找。SpringSecurity生成一个会话id,该id被传递回客户端,以便在任何进一步的服务调用中恢复 client server |

这不是一个简单的问题,因为我正在重新思考通过登录和安全性来保护EJB3.0服务的体系结构

我们在JBoss5.1上有一个EJB3.0应用程序,它为SWT客户机提供各种读写数据的服务。要使用服务,客户端必须使用有效的用户和密码登录,该用户和密码由SpringSecurity在LDAP服务器中查找。SpringSecurity生成一个会话id,该id被传递回客户端,以便在任何进一步的服务调用中恢复

client                            server
   |                                |
   |-> login(user/password)-------->|
   |                                |
   | <------- sessionId ------------| 
   |                                |
   |-->serviceXy(sessionId,param1)->|
在这个解决方案中,我不喜欢的是使用上下文参数污染每个服务方法。 rmi调用中没有类似http会话的机制吗?我正在考虑将上下文对象放入某种会话中,该会话在登录后立即在客户机(?)中创建,并在每次服务调用时传递给服务器,以便SecurityInterceptor可以从这个“神奇上下文”中读取sessionId

大概是这样的:

OurContext ctx = service.login("user","password");
Magical(Jboss)Session.put("securContext", ctx);
service.doSomething("just the string param");

因为您已经在使用appserver,所以似乎应该使用内置的EJB安全机制,通常通过JAAS提供。在4.x jboss行中,如果您为jboss实现了自己的JAAS插件,您可以访问一个“特殊”上下文映射(类似于您所描述的),该映射在远程请求中传递(通过jboss远程调用框架)。我已经有一段时间没有使用jboss了,所以不确定它如何映射到5.1产品,但我不得不想象它有类似的功能。当然,这假设您愿意实现特定于jboss的东西。

EJB中有一些会话机制,但它们都是在远程调用开始时开始的,并在远程调用结束时结束。旧的是事务上下文(Adam Bien不久前写过),新的是CDI会话范围

与流行的观点相反,该作用域不仅镜像http会话作用域,而且在没有http会话(如远程调用)的情况下,它表示单个调用链或消息传递(对于MDB)

有了这样一个会话,您的远程SWT客户端仍然必须将sessionId传递给远程服务,但是从那里调用的任何本地bean都可以从这个“cdi”会话中获取它

另一个选项有点像jtahlborn所说的:使用您自己的登录模块,您可以返回自定义主体,而不是默认主体。您的代码可以首先请求普通主体,然后尝试强制转换它

问题是这些东西是特定于容器的,JBoss总是忘记它。每次更新后它几乎都会断开,用户必须踢和尖叫才能在下一个版本中修复它(只有在之后的版本中才能看到它再次断开)。没有JBoss的支持,这将是一场无休止的战斗


另一个选择是让用户以sessionId作为名称登录。它后面的登录模块可以是一个简单的模块,它接受所有内容,只将主体放在安全上下文中,sessionId为“name”。这有点奇怪,但我们已经成功地使用它将任何可以用字符串表示的数据获取到安全上下文中。当然,您需要让您的客户机在这里执行常规的容器身份验证,这首先有点挫败了使用Spring安全性

我们采用了另一种方法,它是可移植的,不依赖于特定的应用服务器。此外,我们的安全实现将我们从EJB方法的限制中解放出来(顺便说一句,我认为EJB方法在20年前就已经关闭了,但现在又出现了)

自上而下看:

有一个服务器为类提供处理相同数据的方法。 客户端提供数据并调用特定方法


我们的方法是将所有数据(以及客户端和服务器之间的通信)放入“业务对象”中。每个BO扩展一个超类。此超类包含会话id。登录方法提供并返回该id。每个客户端只需确保将在一个BO中接收到的id复制到它发送给服务器的下一个BO中。每个可以远程(或本地)调用的方法都首先获得具有接收id的会话对象。返回会话对象的方法还检查安全约束(基于权限,而不是像EKB方法那样基于角色)。

好吧,在仔细考虑了您的答案后,我必须承认,我找不到更好的解决方案=)。因此,我们将保留由政治原因造成的情景,HRMPF听起来相当不错。对于没有任何参数的服务方法,您的方法如何?
OurContext ctx = service.login("user","password");
Magical(Jboss)Session.put("securContext", ctx);
service.doSomething("just the string param");