java-rmi ejb调用中可重用登录会话的概念
作者:互联网
这不是一个简单的问题,只是因为我正在重新考虑通过登录和安全性保护EJB 3.0服务的体系结构.
我们在JBoss 5.1上有一个EJB3.0应用程序,它为SWT客户端提供各种服务以读取和写入数据.要使用服务,客户端必须使用由LDAP服务器中的SpringSecurity查找的有效用户名和密码登录. SpringSecurity会生成一个会话ID,该会话ID将传递回客户端以在任何其他服务调用中重新使用.
client server
| |
|-> login(user/password)-------->|
| |
| <------- sessionId ------------|
| |
|-->serviceXy(sessionId,param1)->|
情况似乎很清楚.我们将sessionId存储在我们自己的上下文对象中,该对象是每个服务方法的第一个参数.每个服务方法上都有一个拦截器,该拦截器从给定的上下文对象中读取sessionId并检查该会话是否仍然有效.客户端需要首先调用登录服务,以获取一个充满sessionId的上下文对象,并在以后的服务调用中重新使用该上下文对象.
public class OurContext {
private String sessionId;
}
@Stateless
@Interceptors(SecurityInterceptor.class)
public OurServiceImpl implements OurService {
public void doSomething(OurContext context, String param1) {
[...]
}
}
在此解决方案上,我不喜欢的是每种带有上下文参数的服务方法的污染.
是否没有类似的机制,例如rmi调用中的http会话?我正在考虑将上下文对象放在登录后立即在client(?)中创建的某种会话中,并在每次服务调用时传递给服务器,以便SecurityInterceptor可以从此“魔术上下文”读取sessionId ”.
像这样:
OurContext ctx = service.login("user","password");
Magical(Jboss)Session.put("securContext", ctx);
service.doSomething("just the string param");
解决方法:
由于您已经在使用应用程序服务器,因此似乎应该使用内置的EJB安全机制,通常通过JAAS提供.在4.x jboss行中,如果您为jboss实现了自己的JAAS插件,则可以访问“特殊”上下文映射(类似于您描述的内容),该映射在远程请求中传递(由jboss远程调用框架传递) ).我已经有一段时间没有使用jboss了,所以不确定该如何映射到5.1产品,但是我不得不想象它具有类似的功能.当然,这假设您愿意实现jboss特有的功能.
标签:security,jboss,ejb-3-0,java 来源: https://codeday.me/bug/20191201/2084330.html