2010-09-16 3 views
2

по соображениям безопасности мы хотим заблокировать пользователей по IP-адресу в нашем приложении, если они пытаются войти в систему как администратор, и 3 раза введите неверный пароль.Как заблокировать IP с помощью Seam и JBoss AS?

Очень легко получить IP-адрес пользователя, пытающегося войти в систему. Я использую этот код, чтобы получить IP-адрес:

ExternalContext context = FacesContext.getCurrentInstance().getExternalContext(); 
HttpServletRequest request = (HttpServletRequest)context.getRequest(); 
String ip = request.getRemoteAddr(); 

Мы используем JBoss 5.1.0 GA и Seam 2.2.1.CR2. Насколько я знаю, нет способа заблокировать IP-адреса в Seam. Но можно ли вызывать функции 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

Вероятно, есть лучший способ запретить доступ вместо исключения исключения. Вероятно, используя ответ для отправки ошибки, но для простоты я просто показал исключение бросания в коде –

+0

Спасибо за этот отличный ответ, я попробую. :) –

+0

Добро пожаловать. –

1

я не ничего не знаю за что. Но вы можете создать простой фильтр (javax.servlet.Filter) и заблокировать запросы из набора IP-адресов. Это очень просто.

2

Если у вас есть сервер Apache перед вашим сервером Jboss, тогда вызов request.getRemoteAddr(); просто даст вам IP-адрес сервера Apache.

Вместо этого используйте X-Forwarded-For header

Как говорит Плиний, вы можете использовать фильтр. Если вы не хотите этого делать, вы также можете использовать page action.

+0

спасибо за подсказку с заголовком х-пересылаются-за. Очень полезно :) –

 Смежные вопросы

  • Нет связанных вопросов^_^