2010-08-04 72 views
1

我們使用JSF & EJB 3.0(EclipseLink 2.0)。我們需要爲我們的無狀態會話bean中的每個連接使用Oracle代理授權。爲此,我們需要獲取數據庫用戶名以通過代理連接。數據庫用戶名是通過規則從JSF認證用戶名構建的。如何從無狀態會話bean中獲取JSF應用程序用戶名

這裏是話題http://blogs.oracle.com/olaf/2010/04/using_oracle_proxy_authenticat.html

的文章,因此,在經過身份驗證的用戶呼叫JSF管理bean的方法,它的依次調用一些會話bean的方法自己的用戶名必須以某種方式傳遞給會話bean。

現在我有兩個不是很好的解決方案: - 在每個會話bean方法中傳遞用戶名作爲參數(不是非常整潔,但將工作); - 上述文章的解決方案:使用會話bean的類成員變量來存儲用戶名(不是線程安全的和潛在危險的)

P.S.我發現使用線程局部變量的解決方案:_http://www.adam-bien.com/roller/abien/entry/how_to_pass_context_with 它工作正常,但仍然存在問題。我需要在每次調用ejb會話bean之前在每個jsf會話託管bean中放入當前用戶名,因爲它必須位於同一個線程中。

回答

2

如果你的用戶是由容器認證,您可以通過使用javax.ejb.SessionContext注入的情況下這樣的訪問的用戶名在EJB:

@Resource 
private SessionContext context; 

private String getCurrentUsername() { 
    return context.getCallerPrincipal().getName(); 
} 

編輯:如果驗證在配置這工作web.xml通過login-config和security-constraint元素。如果你自己進行認證,你可以使用ServletFilter和一個覆蓋getUserPrincipal,getRemoteUser和isUserInRole(在glassfish中測試)的HttpServletRequestWrapper。

如果你在一個jsf bean中處理認證,那麼這可能不起作用,因爲ejb已經被初始化和注入了。然而,你也可以創建一個只保存用戶名的session scoped ejb,並將這個bean注入到無狀態bean中。

+0

非常感謝Jörn。你的解決方案對我來說很整潔。 P.S.你能告訴我什麼時候SessionContext不會包含當前web層的用戶名嗎? – Andrey 2010-08-04 10:39:32

相關問題