2010-09-16 46 views
2

出於安全原因,我們想要在我們的應用程序中通過IP地址阻止用戶,如果他們試圖以管理員身份登錄並且他們輸入了錯誤的密碼3次。如何用Seam和JBoss AS阻止IP?

獲取試圖登錄的用戶的IP地址非常容易。我使用這段代碼來獲取IP:我們使用JBoss 5.1.0 GA和Seam 2.2.1.CR2。據我所知,在Seam中沒有辦法阻止IP地址。但是有可能調用JBoss函數來阻止特定的IP?

請讓我知道,如果接縫有這個:)

回答

3

這應該很容易做到。

假設你有一個應用程序作用域的設置與所有你想要阻止,您可以使用此過濾器的IP的:

@Startup 
@Scope(ScopeType.APPLICATION) 
@Name("ipFilter") 
@BypassInterceptors 
@Filter(around ="org.jboss.seam.web.ajax4jsfFilter") 
public class IpFilter extends AbstractFilter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
      throws IOException, ServletException { 

     if (!(req instanceof HttpServletRequest)) { 
      chain.doFilter(req, res); 
      return; 
     } 

     HttpServletRequest request = (HttpServletRequest) req; 

     Set<String> ips = (Set<String>)Component.getInstance("blockedIps"); 
     if(ips.contains(request.getRemoteAddr())) { 
     throw new ServletException("Permission denied"); 
     } 

     chain.doFilter(req, res); 

    } 
} 
+0

有可能是拒絕訪問而不是拋出異常的更好方法。可能使用響應發送錯誤,但爲了簡單起見,我只是在代碼 – 2010-09-21 09:17:42

+0

中顯示拋出異常。感謝這個偉大的答案,我會試一試。 :) – 2010-09-22 10:47:10

+0

不客氣。 – 2010-09-22 11:30:07

1

我不知道什麼對於一些支持。但是您可以創建一個簡單的Filter(javax.servlet.Filter)並阻止來自一組IP的請求。這很簡單。

2

如果你的Jboss服務器前有一個Apache服務器,那麼調用request.getRemoteAddr();就會給你提供Apache服務器的IP。

而是使用X-Forwarded-For header

的Plinio如說,你可以使用過濾器。如果你不想這樣做,那麼你也可以使用page action

+0

感謝與X轉發換頭尖端。非常有用:) – 2010-09-20 11:13:23