這不是一個簡單的問題,它僅僅是因爲我正在重新思考我們的架構,以便通過登錄和安全保護我們的EJB 3.0服務。rmi ejb中可重用登錄會話的概念調用
我們在JBoss 5.1上有一個EJB3.0應用程序,它爲SWT客戶端提供讀取和寫入數據的各種服務。要使用服務,客戶端必須使用SpringSecurity在LDAP服務器中查找的有效用戶和密碼進行登錄。 SpringSecurity會生成一個會話標識,該標識將被傳回給客戶端,以便在任何進一步的服務調用中重新使用。
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");
好吧,在思考了很多關於你的答案後,我必須承認,我找不到更好的解決方案=)。所以我們會保持我們的背景情景是由政治原因引起的,hrmpf – martin 2012-01-12 09:07:35