2010-09-16 62 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