2011-02-01 69 views
2

我有一個帶EJB模塊和Web應用程序模塊(servlet)的企業應用程序。我使用URLConnection從EJB訪問servlet URL,但希望以一定的安全性保護URL。我不想使用用戶名和密碼進行身份驗證,因爲我無法使用任何單一登錄解決方案,所以我想如果有一種方法可以限制只能從其企業應用程序訪問的URL。請幫忙。在不使用用戶名密碼認證的情況下保護servlet URL

+0

我試過將常見的類重構成另一個jar,但似乎有太多的其他類的依賴關係,所以它仍然失敗,我仍在調查。但是建議將整個jar文件從WEB-INF/lib移動到APP-INF/lib,以便這些類可以被EJB和webapp模塊訪問?是否會有任何類加載器相關的問題或容器初始化servlet的任何問題? – krish 2011-03-01 04:36:36

+0

請讓我知道如果我在上面的評論中的問題應該作爲一個單獨的問題? – krish 2011-03-01 04:38:08

回答

1

如果它們運行在同一臺計算機上,通常的做法是將servlet正在執行的業務作業重構爲另一個Java類,然後可以由EJB和Servlet導入/使用該類。

+0

在這種情況下重構代碼可能是一個好習慣,但在我的情況下,作業servlet正在執行的操作必須在servlet的上下文中執行。 – krish 2011-02-01 12:28:49

+0

你到底需要什麼servlet上下文? – BalusC 2011-02-01 12:29:50

1

可以用來部署你的servlet的應用程序,並使用該用戶保護應用程序的應用程序服務器中創建用戶憑據(例如使用基本身份驗證):

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name> 
     Entire Application 
    </web-resource-name> 
    <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>member</role-name> 
    </auth-constraint> 
</security-constraint> 

然後,您可以使用您的EJB認證。

3

有很多的信息,你忽略了:

  • 只有通過你的EJB模塊使用的小服務程序,或者它也可用於其他客戶端?
  • Servlet和EJB模塊是否在同一個容器中運行?同一臺物理機器?
  • 您使用的是什麼web服務器/ servlet容器/ J2EE容器?

如果servlet僅由EJB模塊,它們都在同一臺機器上,那麼你可以配置你的Web容器只能從localhost接受連接,改變你的EJB模塊使用指向的URL在localhost而不是一個公共域名或IP地址。

如果它們位於不同的機器上,或者您的servlet被其他客戶端使用,那麼您將需要以某種方式驗證EJB模塊。您可以使用SSL客戶端證書(請參閱this question)或配置您的servlet容器以允許來自EJB模塊IP地址的連接。

EDIT

使用Servlet過濾器來控制訪問是相當簡單的。在你的情況下,你想驗證請求來自本地主機。如果沒有,請將未經授權的消息發送回客戶端。

這是應該做的是一個非常簡單的doFilter方法實現:

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) 
    throws ServletException, IOException 
{ 
    if (!request.getRemoteAddr().equals("127.0.0.1")) { 
     HttpServletResponse rsp = (HttpServletResponse) response; 
     rsp.sendError(HttpServletResponse.SC_FORBIDDEN, "You are not authorized to access this resource."); 
    } 

    chain.doFilter(request, response); 
} 

的東西過濾器添加到您的web.xml類似如下:

<filter> 
    <filter-name>AuthorizationFilter</filter-name> 
    <filter-class>com.foo.bar.AuthorizationFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>AuthorizationFilter</filter-name> 
    <servlet-name>RestrictedServlet</servlet-name> 
</filter-mapping> 

過濾器是順序執行的,他們出現在web.xml中,因此請確保授權過濾器是第一個列出的。

說了這麼多,我在這裏和BalusC一致。如果可能的話,您應該重構代碼,以便EJB模塊直接執行代碼而不是進行servlet調用。

相關問題