这不是一个简单的问题,只是因为我正在重新考虑通过登录和安全保护 EJB 3.0 服务的架构。
我们在 JBoss 5.1 上有一个 EJB3.0 应用程序,它为 SWT 客户端提供各种服务来读取和写入数据。要使用服务,客户端必须使用有效的用户和密码登录,SpringSecurity 在 LDAP 服务器中查找该用户和密码。 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会话的机制吗?我正在考虑将我们的上下文对象放入某种会话中,该会话在登录后立即在客户端(?)中创建,并在每次服务调用时传递到服务器,以便 SecurityInterceptor 可以从这个“神奇上下文”中读取 sessionId ”。
像这样的事情:
OurContext ctx = service.login("user","password");
Magical(Jboss)Session.put("securContext", ctx);
service.doSomething("just the string param");